php - 从 4 个 where 子句中的每一个中选择 1 个 rand() 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 个广告,每个广告位都有多条记录,记录随时可能更改。下面是我用来为特定广告位选择 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/

相关文章:

javascript - 数据未通过 AJAX 调用发送

php - Laravel Scheduler - 如何输出链式/系列命令?

php - 如何将 isAdmin() 更改为 $session->isAdmin

mysql - Ruby on Rails 通过迁移添加另一个索引导致超过 64 个字符的限制

php - MySQL 分组连接

php - 如何在 Laravel 5 中制作 HMVC?

php - 是否可以将用户重定向到远程页面并发送 POST 参数?

php - 允许在 LIKE 中使用反斜杠进行 SQL 注入(inject)

MySQL有条件地创建表

php - Symfony2 中的 Doctrine 多次插入超时