gpt4 book ai didi

sql - 如何在 MySQL 中选择八个随机项目,每个项目都符合特定条件?

转载 作者:行者123 更新时间:2023-11-29 02:07:12 25 4
gpt4 key购买 nike

我有一张横幅表。横幅标有大小 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 (?)

中的下一个查询中使用所有 32 个 id

有更好的解决方案吗? :)

最佳答案

您可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com