在WHERE IN(子查询)中保持顺序

时间:2019-03-31 17:10:04

标签: mysql sql

我在使用WHERE IN子句在子查询中保持顺序时遇到问题。


我正在对下面列出的2个表使用以下查询。

SELECT * FROM user_list WHERE uid IN (
        SELECT uid from user_history ORDER BY timestamp DESC
) LIMIT 5

表格-用户列表

uid name    surname
001 Alpha   Apples
002 Bravo   Butter
003 Charlie Charlie
004 Delta   Duff
005 Echo    Edward

表格-用户历史

uid timestamp
003 0000-00-00 00:00:00
001 0000-00-00 00:00:01
005 0000-00-00 00:00:02

预期结果是(ORDER BY timestamp DESC

005 Echo    Edward
001 Alpha   Apples
003 Charlie Charlie

但是结果是这样

001 Alpha   Apples
003 Charlie Charlie
005 Echo    Edward

ORDER BY子句将被忽略,并且仍然通过主键(uid)进行排序。

我想知道有什么方法可以阻止子查询的订单吗?

4 个答案:

答案 0 :(得分:2)

不需要任何子查询使用join并尝试如下操作

SELECT ul.* FROM user_list ul join user_history uh
on ul.uid=uh.uid
order by uh.timestamp desc
limit 5

子查询order by在主查询输出中没有任何影响

答案 1 :(得分:0)

首先,您必须加入user_history,然后对其进行订购

SELECT * FROM user_list WHERE uid IN (
        SELECT user_history.uid from user_history join user_list where  
 user_list .uid = user_history.uid  ORDER BY user_history.timestamp DESC
) LIMIT 5

答案 2 :(得分:0)

下面的查询可以给您想要的结果。 在两个表上使用联接,然后在主查询中按时间戳对列进行排序。

子查询中的Sortin将提供在in子句中排序的uid,但默认情况下,主查询将提供按id排序的

SELECT u.uid,  u.name , u.surname FROM user_list u, user_history h  WHERE u.uid IN (
        SELECT uid from user_history 
) and u.uid = h.uid order by h.timestamp desc

答案 3 :(得分:0)

我想你想要

SELECT ul.*
FROM user_list ul JOIN
     (SELECT uh.uid, MAX(timestamp) as max_timestamp
      FROM user_history uh
      GROUP BY uh.uid
      ORDER BY MAX(timestamp) DESC
      LIMIT 5
     ) uh
     ON ul.uid = uh.uid
ORDER BY max_timestamp DESC;

user_history中可能有重复项(很可能基于名称)。您似乎想要五个最新记录。因此,这将汇总数据以获取五个最新记录,然后加入user_list并按时间戳按降序返回行。