【问题标题】:Using ORDER BY RAND() in a MySQL UNION Query with separate LIMIT statements在 MySQL UNION 查询中使用 ORDER BY RAND() 和单独的 LIMIT 语句
【发布时间】:2014-05-08 16:31:27
【问题描述】:

我想运行这样的查询,这样我将始终得到 20 个结果,即使第一个 SELECT 语句没有足够的数据来返回 10 个结果。

(
SELECT t.column1, t.column2
FROM table t 
WHERE t.status = 1 
LIMIT 10
)
UNION
(
SELECT t.column1, t.column2 
FROM table t
WHERE t.status = 2 
LIMIT 20 
)
LIMIT 20 

但是我想ORDER BY RAND() 并确保第一个SELECT 语句的所有可用结果都包含在最终结果集中。

当我将 ORDER BY RAND() 添加到此查询的末尾时,它给我的结果集不包括第一个 SELECT 的所有 10 个结果,我假设因为它确实得到 30 行,然后随机选择 20从 30 岁开始。

任何想法将不胜感激。

这对我有用:

SELECT x.*
FROM ((
SELECT t.column1, t.column2
FROM table t 
WHERE t.status = 1 
LIMIT 10
)
UNION
(
SELECT t.column1, t.column2 
FROM table t
WHERE t.status = 2 
LIMIT 20 
)
LIMIT 20) x
ORDER BY RAND

【问题讨论】:

    标签: mysql random union


    【解决方案1】:

    如果您在应用 LIMIT 20 之前先按它们“来自”的 SELECT 对 UNION 结果进行排序,则应该可以:

    SELECT … FROM
    (
      (
        SELECT t.column1, t.column2, 0 AS ordervalue FROM … WHERE …
        LIMIT 10
      )
      UNION
      (
        SELECT t.column1, t.column2, 1 FROM … WHERE …
        LIMIT 20 
      )
      ORDER BY ordervalue ASC # this will make the values from your first SELECT come
                              # first, then the ones from the second
    
      LIMIT 20 # of those ordered values, the first 20 are taken
    )
    ORDER BY RAND()
    

    我在这里引入了一个静态值 ordervalue - 在您的特殊情况下,这不是必需的,因为您选择 status 1 或 2,因此您可以直接按该值订购。但如果不是这种情况(或者状态值会不同),那么“伪”列值将是可行的方法。

    【讨论】:

    • 我认为对我来说关键是在所有内容的外部添加一组括号,并将 ORDER BY RAND() 放在最后 SELECT FROM ((SELECT ...) UNION (SELECT . ..)) 按兰德订购
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多