在mysql中选择UNION和ORDER BY ..怎么样?

时间:2010-07-04 16:09:38

标签: sql mysql

我想从单个表中获取所有行,但是以不同的方式对它们进行排序。 例如,我写

(SELECT * FROM table1
ORDER BY fieldA ASC LIMIT 3
)
UNION
(
SELECT * FROM table1
ORDER BY FieldB DESC
)

它的工作原理是,(FIELDB DESC)的二阶被忽略了......有人知道为什么? 谢谢

2 个答案:

答案 0 :(得分:17)

UNION运算符执行隐含排序作为联合操作的一部分(IIRC,在关键列上)。

如果您希望在结果中进行其他排序,则必须将ORDER BY应用于联合选择。

在您的情况下,您需要某种方法来区分第一个选择和第二个选择,以便您可以正确地订购联合。像(未经测试)的东西:

(SELECT table1.*, 0 AS TMP_ORDER FROM table1 ORDER BY fieldA ASC LIMIT 3)
UNION
(SELECT table1.*, 1 AS TMP_ORDER FROM table1)
ORDER BY TMP_ORDER ASC, 
CASE WHEN TMP_ORDER = 0 THEN fieldA ELSE 0 END ASC, 
CASE WHEN TMP_ORDER = 1 THEN fieldB ELSE 0 END DESC

这种方法的问题在于,您将在UNION中作为第一个查询的一部分选择的三行重复(因为列不完全匹配)。

您确定不能使用两个SELECT声明吗?

答案 1 :(得分:1)

您可以将第二个SELECT声明为固定结果..

SELECT  'First select option' AS something

UNION

SELECT something
FROM(
    (SELECT something
    FROM SomeTable
    ORDER BY something ASC)) FixedResult