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

Php 从4个where子句中各选择1个rand(),php,mysql,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条记录并将它们放入一个PHP数组

使用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条记录并将它们放入一个PHP数组中,然后为每个adspot随机选择1条。这比运行4个带有不同where子句的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

兰德公司的订单效率很低

做一个快速计数查询,使用PHP使用数字并得到4个随机数,然后在查询中使用这些数字

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代码中对其进行迭代。

如果允许数据库中的每个广告仅存在于特定广告点中,则无法将这四个查询优化为一个。您需要使用单独的查询,因为您将在页面上的不同位置输出结果。每个广告点可以有多个广告。我正在做的是在页面加载之前查询所有广告,将它们放入一个数组中,并在它们特定的广告点中回送它们。即使它们在特定的位置是静态的,您的查询也可以而且应该合并为一个查询。4个查询肯定会影响性能。您有两个选项:将查询返回为四行并使用php进行转换,或者使用MAXIFad_spot=1、ad_name、NULL将四行转换为sql查询本身中包含四列的一行。。。等等。这是如何解释为每个adspot 1、2、3、4得到一个广告的呢?你可以用上面的方法这样做。选择MAXIFad_id=random_number_1,ad_name,NULL为'ad_spot_1',MAXIFad_id=random_number_2,ad_name,NULL为'ad_spot_2'。。。。
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