【问题标题】:MYSQL when using UNION keyword the ordering of the first query Ordering is not workingMYSQL 使用 UNION 关键字时,第一个查询的排序排序不起作用
【发布时间】:2013-11-07 01:28:08
【问题描述】:

我有一个查询,我想在一个 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 关键字?

【问题讨论】:

标签: mysql


【解决方案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演示

【讨论】:

    【解决方案2】:

    联合后你错过了兰特。

    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 的查询和随机订单。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多