MYSQL UNION ORDERING

时间:2010-11-24 14:10:06

标签: sql mysql

是否可以订购第一个查询并保留首先返回的行,而不是订购第二个查询。 (如果那样的话)

我目前的调查的一个例子是:

SELECT
    *
FROM 
    Devices
WHERE
    Live = 'true'
    AND Category = 'apple'
ORDER BY
    ListOrder
UNION
SELECT
        *
    FROM
        Devices
    WHERE
        DeviceLive = 'true'

我希望apple类别下的设备按照列表顺序进行组织,并且位于其他设备上方列表的顶部。但这似乎将两个问题混杂在一起。

4 个答案:

答案 0 :(得分:16)

您需要引入人工排序键。类似的东西:

SELECT
    *, 1 as SortKey
FROM 
    Devices
WHERE
    Live = 'true'
    AND Category = 'apple'
UNION
SELECT
        *, 2 as SortKey
    FROM
        Devices
    WHERE
        DeviceLive = 'true'
ORDER BY SortKey, ListOrder

答案 1 :(得分:5)

UNION具有隐式重复数据删除功能。这意味着使用它的副作用是一切都混杂在一起,因为它的排序将发生。它(通常,但不总是)意味着你得到排序输出(参见下一段)。

UNION ALL删除了这一点,但是,仍然需要注意的是,没有明确order by的查询输出无法保证排序。这已被另一个答案所涵盖,但我认为值得指出其重要性。

答案 2 :(得分:3)

你可以假装它

SELECT col1, col2 ... 
FROM (
  SELECT 1 fake_order, col1, col2 ... FROM Devices WHERE Live ='true' AND Category='apple' ORDER BY ListOrder
  UNION ALL
  SELECT 2, col1, col2 ... FROM Devices WHERE DeviceLive ='true'
) AS T 
ORDER BY fake_order

(未经测试的SQL在我的头顶)

答案 3 :(得分:0)

我从Joe Stefanelli那里得到了答案,但稍微修改了一下:

嗨,我不需要制作人工排序键,我只是确保每个表都具有我想要排序的列的相同名称。就我而言,列名是“order”。所以我做了:

Select *, order as uOrder from table 1 
UNION 
select *, order as uOrder from table 2 
ORDER BY uOrder