MySQL UNION 2查询包含ORDER BY

Pao*_*rdo 5 mysql sql union

我正在尝试UNION两个包含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()
Run Code Online (Sandbox Code Playgroud)

更新:这是基于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();
Run Code Online (Sandbox Code Playgroud)

Abh*_*hay 5

这是你的解决方案:

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();
Run Code Online (Sandbox Code Playgroud)

我所做的改变是:

  1. 作为UNION一部分的每个查询都应该用括号括起来(第一个查询以粗体显示;第二个查询已被封装)
  2. 删除了profile3第二个查询的别名
  3. 对于final ORDER BY RAND(),您必须为派生表创建UNION结果集; 我把它TEMP作为别名

我没有测试上面的查询,但我希望它应该工作.让我知道你的发现.