0

我有一个查询,我想在一个 mysql 查询中选择带有标准广告的特色广告(一个查询,因为网站流量很高,所以在数据库中执行两个查询会导致性能问题)

*要求是选择所有精选广告,然后选择 2 个标准广告,并且它们都必须随机订购。*

所以我使用了以下查询,它适用于 UNION 关键字,但问题是 RANDOM 的排序仅适用于第二个查询。

( SELECT * FROM ads WHERE status='Y' AND priority='High' ORDER BY RAND() )
        UNION (SELECT * FROM ads WHERE status='Y' AND count<=limits 
        AND priority!='High' 
        ORDER BY RAND() LIMIT 0 , 2
) 

我在这里做错了什么?有任何想法吗 ?作为一个附带问题,任何性能友好的方式来选择随机行而不是使用 RAND 关键字?

4

2 回答 2

1

工会后你错过了兰特。

SELECT * from
( SELECT * FROM ads WHERE status='Y' AND priority='High' )
        UNION 
( SELECT * FROM ads WHERE status='Y' AND count<=limits AND priority!='High' LIMIT 0 , 2 ) ADS 
ORDER BY RAND()

这会创建一个联合结果集,其中包含作为 ADS 的查询和随机订单。

于 2013-11-07T01:39:52.827 回答
1

尝试

SELECT *
  FROM
(
  SELECT * 
    FROM ads 
   WHERE status = 'Y' 
     AND priority = 'High' 
   ORDER BY RAND()
) q
UNION ALL
(
  SELECT * 
    FROM ads 
   WHERE status = 'Y' 
     AND count <= limits 
     AND priority <> 'High' 
   ORDER BY RAND() 
   LIMIT 2
)

注意:由于特色广告和标准广告不会重叠使用UNION ALL而不是UNION

这是SQLFiddle演示

于 2013-11-07T01:56:28.650 回答