使用 MySQL 和 PHP。我正在尝试从表格中随机选择 4 个广告。 1 个用于 adspot 1、1 个用于 adspot 2、1 个用于 adspot 3、1 个用于 adspot 4。这是我的表格的样子:
ad_id | ad_spot | ad_html
1 | 3 | <ad html>
2 | 1 | <ad html>
3 | 4 | <ad html>
4 | 2 | <ad html>
表中大约有 1200 个广告,每个广告位都有多条记录,记录随时可能更改。下面是我用来为特定广告位选择 1 个随机广告的查询:
SELECT ad_html FROM ads WHERE ad_spot = '2' ORDER BY RAND() LIMIT 1
我为一个脚本计时,该脚本选择了所有 1200 条记录并将它们放入一个 PHP 数组中,然后为每个广告位随机选择 1 个。这比使用不同的 where 子句运行 4 个 MySQL 查询平均花费更长的时间来选择带有 RAND() 的广告。
将以下查询合并为一个查询的最有效方法是什么?
SELECT ad_html FROM ads WHERE ad_spot = '1' ORDER BY RAND() LIMIT 1
SELECT ad_html FROM ads WHERE ad_spot = '2' ORDER BY RAND() LIMIT 1
SELECT ad_html FROM ads WHERE ad_spot = '3' ORDER BY RAND() LIMIT 1
SELECT ad_html FROM ads WHERE ad_spot = '4' ORDER BY RAND() LIMIT 1
最佳答案
SELECT
MAX(IF(row_num = 1, ad_html, NULL)) AS 'ad_space_1',
MAX(IF(row_num = 2, ad_html, NULL)) AS 'ad_space_2',
MAX(IF(row_num = 3, ad_html, NULL)) AS 'ad_space_3',
MAX(IF(row_num = 4, ad_html, NULL)) AS 'ad_space_4'
FROM
(
SELECT
@row_num := @row_num + 1 AS 'row_num',
ad_html
FROM
(SELECT
@cnt := COUNT(*) + 1,
@lim := 4,
@row_num := 0
FROM
ads
) vars
STRAIGHT_JOIN
(
SELECT
r.*,
@lim := @lim - 1
FROM
ads r
WHERE
(@cnt := @cnt - 1)
AND RAND(203121231) < @lim / @cnt
) i
) j
每次从您的 php 查询(时间戳等)时,给它一个随机种子。或者,您可以省略外部查询,内部查询将返回 4 行,您可以在 php 代码中遍历这些行。
关于php - 从 4 个 where 子句中的每一个中选择 1 个 rand() mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574308/