简体   繁体   English

MySQL UNION SELECT语句由两个不同的列顺序

[英]MySQL UNION SELECT statement order by two different columns

I have a table with a column called "myorder". 我有一个表,其中有一列叫做“ myorder”。 I want to only order the first 5 elements in ascending order by using the column "myorder" and then the rest of the elements ordererd by id in descending order. 我只想通过使用“ myorder”列以升序排列前5个元素,然后按id降序排列其余元素。 I've tried but I don't seem to get this 100%. 我已经尝试过了,但我似乎并没有100%做到这一点。 I have created a sqlfiddle with this simple example. 我用这个简单的例子创建了一个sqlfiddle Can anybody help me? 有谁能够帮助我?

The order in the sqlfiddle should be: Blue, Brown, Yellow, Red, Green, Orange, Gray, Black, White. sqlfiddle中的顺序应为:蓝色,棕色,黄色,红色,绿色,橙色,灰色,黑色,白色。

Append this to the end of your sql statement: 将此附加到sql语句的末尾:

ORDER BY FIELD(id, 3,4,5,1,2,9,8,7,6) 按字段排序(id,3,4,5,1,2,9,8,7,6)

This will manually sort the results based on the id field in the specified order getting the colours in order. 这将根据指定顺序的id字段对结果进行手动排序,以按顺序获得颜色。

Alternatively you could: 或者,您可以:

ORDER BY FIELD(NAME, BLUE,BROWN,YELLOW......) 按字段排序(名称,蓝色,棕色,黄色......)

Union does not preserves order, at least not in all databases. 联合不会保留顺序,至少不是在所有数据库中都保留顺序。 To get this done you need to select a fake column and use order on the results (total) 为此,您需要选择一个伪列并在结果上使用顺序(总计)

Here is a solution: 这是一个解决方案:

(

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

This Will work in any case, as long as you keep the fake number high enough. 只要您将假号码保持足够高,这在任何情况下都可以使用。

maybe try 也许尝试

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

if by "first 5" you mean ones with nonzero myorder 如果用“前5”表示您的myorder非零

Can we have NULL value instead of zero when myorder is not specified? 未指定myorder时,可以将NULL值而不是零值吗?

If so we can do this: 如果是这样,我们可以这样做:

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

Fiddle: 小提琴:

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

Hint on forcing nulls to sort last: MySQL Orderby a number, Nulls last 提示强制null排在最后: MySQL Orderby一个数字,Null排在最后

Use a CASE statement and the following trick (for example): 使用CASE语句和以下技巧(例如):

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

SQL Fiddle SQL小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM