【发布时间】:2023-03-24 18:15:02
【问题描述】:
如何通过从这两个查询中检索到的结果获得组合顺序,并通过 UNION 连接?
SELECT u.id, u.name, u.gender, n.user, n.other_user, n.type, n.notification, n.membership, n.link, n.created_at, p.photo FROM notifications n
INNER JOIN users u ON
CASE
WHEN n.user = :me THEN u.id = n.other_user
WHEN n.other_user = :me THEN u.id = n.user
END
LEFT JOIN photos p ON
CASE
WHEN n.user = :me THEN p.user = n.other_user AND p.order_index = (SELECT MIN(order_index) FROM photos WHERE user = n.other_user)
WHEN n.other_user = :me THEN p.user = n.user AND p.order_index = (SELECT MIN(order_index) FROM photos WHERE user = n.user)
END
UNION
SELECT '', '', '', '', '', '', n.notification, n.membership, n.link, n.created_at, '' FROM notifications n WHERE type = 'admin'
我希望返回的记录按照 ids 的降序排列。例如,如果第一个查询返回的记录是3,5,4,6,7,第二个查询返回的记录是2,1,9,那么所有的记录都应该像9,7,6,5,4,3,2,1这样组合排序。
我试过这个:
SELECT * FROM
(
*THE WHOLE QUERY ABOVE*
) AS x
ORDER BY x.id
这没有返回正确的结果。它按降序排列第一个查询的结果7,6,5,4,3,并按升序排列第二个查询的结果1,2,9。它们是单独排序的,而不是一起排序的。我怎样才能将它们组合在一起为9,7,6,5,4,3,2,1。
【问题讨论】:
-
只需在最后添加
ORDER BY id DESC。 -
等待...第二个查询为每个
id生成''(空字符串)。你确定这是正确的吗? -
id是数字列还是 VARCHAR 列?如果它是 VARCHAR,则需要对其进行后处理并将其转换为数字,以使排序按预期工作。 -
@TheImpaler 它的数据类型是
BIGINT -
@TheImpaler 当您指出第二个查询用
''代替id时,我的脑海中闪过一抹亮光。我继续用n.id替换第一个''。有了这个,顺序确实发生了变化,但我仍然没有得到正确的结果。这次它返回了混合的结果。未按要求按正确的降序排列。此外,在更正此问题后,我什至尝试使用ORDER BY x.id DESC,但这也没有用。
标签: mysql sql sorting sql-order-by union