从4个where子句mysql中选择1个rand()

时间:2012-03-05 21:32:02

标签: php mysql

使用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

2 个答案:

答案 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在查询中使用这些数字。