【问题标题】:MySQL UNION 2 queries containing ORDER BYs包含 ORDER BY 的 MySQL UNION 2 查询
【发布时间】:2011-09-17 20:36:56
【问题描述】:

我正在尝试合并两个都包含 ORDER BY 的查询。 正如我所发现的,您不能通过属于 UNION 的查询进行排序。 我只是不知道该怎么做这个查询。让我解释一下我想要做什么。

  1. 我正在尝试选择 40 个最近的配置文件,并从该列表中随机选择 20 个。然后我想将其与:
  2. 随机选择40个配置文件,其中配置文件不属于第一组查询的原始40个最近的配置文件
  3. 随机排列整组 60 条记录。

我知道使用 Rand() 函数对效率的影响

SELECT profileId
  FROM (SELECT profileId
          FROM profile profile2
         WHERE profile2.profilePublishDate <= Now()
      ORDER BY profile2.profilePublishDate DESC
         LIMIT 0,40) AS profile1
ORDER BY RAND()
   LIMIT 0,20
UNION (SELECT profileId
         FROM profile profile4
        WHERE profileId NOT IN (SELECT profileId
                                  FROM profile profile4
                                 WHERE profile4.profilePublishDate <= Now()
                              ORDER BY profile4.profilePublishDate DESC
                                 LIMIT 0,40)    
     ORDER BY RAND()    
        LIMIT 0,40) as profile3
ORDER BY RAND()

更新:这是基于以下 Abhay 帮助的解决方案(感谢 Abhay):

SELECT *
FROM
(
    (
        SELECT profileId
        FROM 
        (
            SELECT profileId
            FROM profile profile2
            WHERE profile2.profilePublishDate <= Now()
            ORDER BY profile2.profilePublishDate DESC
            LIMIT 0,40
        ) AS profile1
        ORDER BY RAND()
        LIMIT 0,20
    )
    UNION
    (
        SELECT profileId
        FROM profile profile4
        WHERE profileId NOT IN (
            SELECT * FROM
            (
            SELECT profileId
            FROM profile profile4
            WHERE profile4.profilePublishDate <= Now()
            ORDER BY profile4.profilePublishDate DESC
            LIMIT 0,40
            ) AS temp2
         )
        ORDER BY RAND()    
        LIMIT 0,40
    )
) TEMP
ORDER BY RAND();

【问题讨论】:

    标签: mysql sql union


    【解决方案1】:

    您可以将整个查询包含在另一个选择中(要进行子选择)并在该结果集上包含ORDER BY RAND()。然而,这非常复杂(许多随机的ORDER BY 语句,而您只需要一个语句),因此收集有序数据集(即仅profile1profile3UNION)到使用您选择的语言的数组并随机化该数组的顺序。

    【讨论】:

    • 他确实需要内心的ORDER BY RAND()
    • @ypercube 为什么在重新排序整个结果集时需要​​内部ORDER BY
    • 因为它与LIMIT 40结合使用,可以从表格的一部分随机选择40行,从另一部分随机选择20行(使用LIMIT 20)。
    • @ypercube 谢谢,在您第一次发表评论后忘记重新 RTFQ,答案已更新;)
    【解决方案2】:

    这是你的解决方案:

    SELECT *
    FROM
    (
        **(**
            SELECT profileId
            FROM 
            (
                SELECT profileId
                FROM profile profile2
                WHERE profile2.profilePublishDate <= Now()
                ORDER BY profile2.profilePublishDate DESC
                LIMIT 0,40
            ) AS profile1
            ORDER BY RAND()
            LIMIT 0,20
        **)**
        UNION
        (
            SELECT profileId
            FROM profile profile4
            WHERE profileId NOT IN (
                SELECT profileId
                FROM profile profile4
                WHERE profile4.profilePublishDate <= Now()
                ORDER BY profile4.profilePublishDate DESC
                LIMIT 0,40
                )
            ORDER BY RAND()    
            LIMIT 0,40
        )
    ) TEMP
    ORDER BY RAND();
    

    我所做的更改是:

    1. 属于 UNION 的每个查询都应括在括号中(第一个查询以粗体显示;第二个已被括起来)
    2. 为您的第二个查询删除了别名 profile3
    3. 对于最终的ORDER BY RAND(),您必须将UNION 结果集创建到派生表;我给了它TEMP 作为别名

    我没有测试过上面的查询,但我希望它可以工作。让我知道你的发现。

    【讨论】:

    • 谢谢-您的解决方案解决了我的问题,但是出现了一个新错误(此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'),我也解决了另一个在我的原始帖子中选择并发布上面的完整查询。感谢您帮助解决此问题。
    • @Cheeky:是的,这是解决问题的方法,但有 MySQL 的限制:)
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多