包含ORDER BY的MySQL UNION 2查询

| 我正在尝试联合两个都包含ORDER BY \的查询。 正如我发现的那样,您无法通过属于UNION的查询进行排序。 我只是不知道该怎么办呢。让我解释一下我要做什么。 我正在尝试选择40个最新的配置文件,然后从该列表中选择20个随机集。然后,我希望将其与: 选择40个随机配置文件,其中配置文件不属于第一组中查询的原始40个最新配置文件 随机订购整套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();
    
已邀请:
        这是您的解决方案:
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();
我所做的更改是: 您属于UNION的每个查询都应放在方括号中(第一个查询以粗体显示;第二个查询已被封装) 为第二个查询删除了别名“ 3” 对于最后的“ 4”,必须将UNION结果集创建到派生表;我给它取了“ 5”作为别名 我尚未测试以上查询,但希望它能正常工作。让我知道你的发现。     
        您可以将整个查询包含在另一个选择中(以使其成为子选择),并在该结果集上加上
ORDER BY RAND()
。但是,这非常复杂(许多随机的
ORDER BY
语句仅在需要时使用),因此将有序数据集(即just9ѭ和
profile3
中的
UNION
)收集到您所用语言的数组中可能会减少处理器的工作量选择并随机化该数组的顺序。     

要回复问题请先登录注册