使用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数组中,然后为每个adspot随机选择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
答案 0 :(得分: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代码中迭代。
答案 1 :(得分:0)
ORDER BY RAND()的效率非常低。
如何快速进行COUNT查询,使用PHP来使用数字并得到(4)随机数,然后使用IN在查询中使用这些数字。