MySQL:不能订购联盟的一方

时间:2015-01-14 02:21:20

标签: mysql sql

我有这样的查询:

(SELECT * FROM something WHERE ...) UNION (SELECT * FROM something WHERE ...)

因为我希望第一个SELECT的结果排在首位。但是,第二部分以相反的顺序出现。我不能简单地订购整个查询,因为它会将我需要的第一个SELECT推到顶部...所以我想做这样的事情:

(SELECT * FROM something WHERE ...) UNION (SELECT * FROM something WHERE ...  ORDER BY timestamp DESC)

但这不起作用,ORDER BY完全被忽略;我通过插入乱码来测试这个,ORDER BY dosaif30h仍然有效...一个解决方案是做两个单独的查询,但我更喜欢在一个处理它。

3 个答案:

答案 0 :(得分:2)

SELECT * FROM something WHERE ... UNION SELECT * FROM (SELECT * FROM something WHERE ...  ORDER BY timestamp DESC)a

答案 1 :(得分:1)

如果你想在一个订单中订购它们,那么你需要这样的东西:

SELECT * FROM (
    SELECT * FROM table_1 where something
    UNION
    SELECT * FROM table_2 WHERE something
) as tt
ORDER BY something

请注意,两个表都应具有相同的列名和计数。

如果您只想订购第二个查询,那么:

SELECT * FROM table_1 where something
        UNION
SELECT * FROM (SELECT * FROM table_2 WHERE something ORDER BY something) as tt

答案 2 :(得分:1)

如果您希望第一个表首先出现,那么您需要明确订购:

SELECT s.*
FROM ((SELECT s.*, 1 as which FROM something s WHERE ...)
      UNION ALL
      (SELECT s.*, 2 as which FROM something s WHERE ...)
     ) s
ORDER BY which, timestamp DESC

在大多数情况下,您只能信任外部查询中的order by,如果您希望以特定顺序显示结果。

注意:如果您愿意,可以在没有子查询的情况下编写:

SELECT s.*, 1 as which FROM something s WHERE ...
UNION ALL
SELECT s.*, 2 as which FROM something s WHERE ...
ORDER BY which, timestamp;