我在使用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
)进行排序。
我想知道有什么方法可以阻止子查询的订单吗?
答案 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
并按时间戳按降序返回行。