- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一张横幅表。横幅标有大小 ID 和插槽 ID(页面上的位置)。
我需要选择 8 个相同尺寸的横幅,11-18(广告位 ID)之间的每个广告位 1 个,并在每次页面浏览时保持随机性,以便每次横幅广告都不同,如果所需广告位有任何不同的话。
我找到的唯一解决方案是:
SELECT *
FROM banners
WHERE slot IS NOT NULL AND slot > 10 AND slot < 19
AND NOT IN (?)
GROUP BY slot
LIMIT 8
保留提取的横幅 ID 的踪迹,并在下一次查询中使用它们。
但问题是计算是否有 8 个横幅(也许某些广告位 ID 的横幅比其他广告位更多)。何时停止收集“NOT IN”的 ID 并重置轮换。
在这种情况下,是否有另一种解决方案来保持横幅的良好随机旋转?
测试表:
CREATE DATABASE IF NOT EXISTS `test123` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `test123`;CREATE TABLE IF NOT EXISTS `test` ( `banner_id` int(11) NOT NULL DEFAULT '0', `slot` int(11) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;/*!40000 ALTER TABLE `test` DISABLE KEYS */;REPLACE INTO `test` (`banner_id`, `slot`) VALUES (284, 11), (283, 12), (282, 13), (280, 14), (281, 14), (278, 15), (279, 15), (277, 16), (276, 17), (274, 18), (275, 18);/*!40000 ALTER TABLE `test` ENABLE KEYS */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
Solution from Lieven:
(SELECT * FROM test WHERE slot = 11 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 12 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 13 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 14 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 15 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 16 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 17 ORDER BY RAND() LIMIT 1)
UNION ALL (SELECT * FROM test WHERE slot = 18 ORDER BY RAND() LIMIT 1)
如果我为插槽 11 - 18 选择所有横幅的 ID 并在 session 中设置一个标志,这样它就不会一直获取所有 ID,会怎样?然后通过 PHP 选择随机 ID 并为这些 ID 获取横幅,然后从 session 数组中删除这些 ID,当数组为空时,我要重复所有步骤吗?
这将为每个 session 产生 1 个查询和 1 个用于选择横幅本身的查询。
当然,对于每个插槽有数千条横幅的大 table 来说,这不是一个解决方案。
或者将第一个查询限制为 32,然后在 NOT IN (?)
有更好的解决方案吗? :)
最佳答案
您可以使用 MySQL 的 RAND() 使返回结果的顺序随机。功能。
轮换的好坏取决于MySQL中随机化的实现。
我对此没有任何经验。
我想我终于明白了这个要求。不幸的是,我不知道以下查询是否适用于 MySQL。
SELECT * FROM Banners WHERE Slot = 11 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 12 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 13 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 14 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 15 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 16 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 17 ORDER BY RAND() LIMIT 1
UNION ALL SELECT * FROM Banners WHERE Slot = 18 ORDER BY RAND() LIMIT 1
关于sql - 如何在 MySQL 中选择八个随机项目,每个项目都符合特定条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3966675/
我是一名优秀的程序员,十分优秀!