我想从单个表中获取所有行,但是以不同的方式对它们进行排序。 例如,我写
(SELECT * FROM table1
ORDER BY fieldA ASC LIMIT 3
)
UNION
(
SELECT * FROM table1
ORDER BY FieldB DESC
)
它的工作原理是,(FIELDB DESC)的二阶被忽略了......有人知道为什么? 谢谢
答案 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