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


select 1 rand() from each of 4 where clauses mysql

使用MySQL和PHP。我试图从一张表中随机选择4个广告。1用于adspot 1,1用于adspot 2,1用于adspot 3,1用于ad spot 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条。这平均比运行4个MySQL查询(使用不同的where子句)用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代码中对其进行迭代。

ORDER BY RAND()的效率非常低。

做一个快速的COUNT查询,使用PHP使用这个数字并获得(4)个随机数字,然后使用in.

在查询中使用这些数字怎么样