MySQL UNION SELECT语句按两个不同的列排序

时间:2014-04-01 21:13:27

标签: mysql

我有一个名为" myorder"的列。我想只使用列#34; myorder"按升序排序前5个元素。然后其余的元素ordererd由id按降序排列。我已经尝试了,但我似乎没有得到这100%。我用这个简单的例子创建了一个sqlfiddle。有人能帮助我吗?

sqlfiddle中的顺序应为:蓝色,棕色,黄色,红色,绿色,橙色,灰色,黑色,白色。

5 个答案:

答案 0 :(得分:0)

将其附加到sql语句的末尾:

  

ORDER BY FIELD(id,3,4,5,1,2,9,8,7,6)

这将根据指定顺序的id字段手动对结果进行排序,以便按顺序获取颜色。

或者你可以:

  

按字段排序(姓名,蓝色,棕色,黄色......)

答案 1 :(得分:0)

Union不会保留订单,至少不会保留在所有数据库中。 要完成此操作,您需要选择一个假列并在结果上使用顺序(总计)

这是一个解决方案:

SELECT Id, myorder, myorder as fake, name from tbl WHERE myorder!=0) UNION 
(SELECT id, myorder, 2000 as fake,name  from tbl WHERE myorder=0) ORDER BY fake asc, id desc

只要你保持假数字足够高,这将无论如何都有效。

答案 2 :(得分:0)

也许试试

SELECT * from tbl ORDER BY IF(myorder=0, 2147483647, myorder) ASC, id DESC

如果通过"前5"你的意思是非零myorder

答案 3 :(得分:0)

如果未指定myorder,我们可以使用NULL值而不是零吗?

如果是这样,我们可以这样做:

SELECT * from tbl ORDER BY -myorder DESC, id DESC

小提琴:

http://sqlfiddle.com/#!2/ef9ee/4

提示强制空值排序最后:MySQL Orderby a number, Nulls last

答案 4 :(得分:0)

使用CASE语句和以下技巧(例如):

SELECT *, 
CASE myorder
    WHEN 0 THEN id
    ELSE 99999999 - myorder
END AS ord
FROM tbl
ORDER BY ord DESC

SQL Fiddle