mysql SQL: mục cụ thể được xếp đầu tiên và sau đó sắp xếp phần còn lại của các mục


79

Giả sử tôi có bảng dưới đây.

Tôi muốn có tất cả bạn bè, nhưng tôi muốn id 5 là mục đầu tiên trong danh sách. Tôi không quan tâm đến đơn đặt hàng mà tôi nhận được các mặt hàng còn lại.

Kết quả truy vấn mong muốn sẽ là:

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

Tôi có thể làm cái này như thế nào?

sử dụng Mysql 5.1.x.

Cảm ơn!

Câu trả lời:


147
select id,name 
from friends 
order by id=5 desc

(vì bạn không quan tâm đến thứ tự của phần còn lại, nếu không, ví dụ: phần còn lại theo id asc )

select id,name 
from friends 
order by id=5 desc, id asc

10
@ maxx777 Câu hỏi này được gắn thẻ MySQL, hiện thuộc sở hữu của Oracle. Không phải "sql-server", như trong Microsoft SQL Server.
RichardTheKiwi

1
Tôi nghĩ rằng hầu hết các truy vấn hoạt động trên tất cả các DBMS. Và nếu ai đó nói rằng truy vấn này không hoạt động trên một DBMS cụ thể, thì thông thường họ đang yêu cầu giải pháp cho DBMS cụ thể đó.
maxx777

8
@ maxx777 Đó là lý do tại sao chúng tôi có thẻ và câu hỏi riêng biệt. Nó hoạt động cho người hỏi về vấn đề MySQL của anh ta. Nếu bạn muốn SQL Server 2005, câu trả lời khác có nó, không cần phải bình luận vì rõ ràng rằng câu trả lời này không hoạt động trên những gì nó chưa bao giờ được quảng cáo để hoạt động.
RichardTheKiwi,

48

Thử đi:

select id,name 
from friends 
order by case when id=5 then -1 else id end

nếu bạn có nhiều hơn thì bạn có thể làm:

select id,name 
from friends 
order by case when id in (5,15,25) then -1 else id end,id

4

Tôi không thể truy cập MySQL bây giờ để kiểm tra, vì vậy nó có thể bị đảo ngược ... nhưng bạn có thể sử dụng thực tế là Booleans cũng sắp xếp và bạn có thể có một số trường sắp xếp.

SELECT ... ORDER BY id != 5, id

(bạn có thể phải viết id = 5, tôi không thể nhớ liệu TRUE sắp xếp trước hay sau FALSEs.)

CHỈNH SỬA: Ồ, tôi chỉ biết rằng bạn không quan tâm đến thứ tự của phần còn lại, trong trường hợp đó, tôi chân thành giới thiệu câu trả lời của @ Richard.


3
Tôi thích id=5 desc, bởi vì khi các cột bao gồm null, !=5puts null đầu tiên
RichardTheKiwi

2

Nếu bạn muốn làm tương tự cho truy vấn UNION, chẳng hạn như nếu bạn có:

select id,name 
from friends 
UNION
select id,name 
from friends 
order by id=5 desc

... bạn sẽ nhận được một ngoại lệ trong PostgreSQL:

Chỉ có thể sử dụng tên cột kết quả, không được sử dụng biểu thức hoặc hàm. GỢI Ý: Thêm biểu thức / hàm vào mọi SELECT hoặc di chuyển UNION thành mệnh đề from

Để giải quyết vấn đề này, bạn sẽ sử dụng như sau:

select id,name, (id=5) AS is_five
from friends 
UNION
select id,name, (id=5) AS is_five
from friends 
order by is_five DESC, id DESC

Biểu thức (id = 5) sẽ trả về 't' HOẶC 'f', tùy thuộc vào việc giá trị cột của bạn có bằng hay không với giá trị mong đợi (5), do đó, thứ tự đầu tiên sẽ xếp thứ tự các cột 't', sau đó nghỉ ngơi.


2

Bạn nên sử dụng mệnh đề ORDER BY FIELD của MySQL để giải quyết vấn đề này. Mặc dù, câu trả lời đã được chấp nhận về điều này, đây là một giải pháp tốt hơn.

select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col 
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;

Điều này tốt hơn

  • id = something, đặt hàng theo id asc
  • thứ tự theo từng trường hợp khi cái gì đó thì 1 khi cái gì đó_else rồi 2 kết thúc desc

1
Không chắc tại sao điều này lại bị phản đối. Tôi muốn biết tại sao trật tự của lĩnh vực nên tốt hơn nhưng câu trả lời là thú vị ..
John

@John - Điều này tốt hơn chủ yếu vì dễ đọc. Ngoài ra, đó là một giải pháp mà MySQL đang cung cấp cho chúng tôi. Đối với tôi, dường như khi bạn phải chỉ định thứ tự cho nhiều giá trị trong một cột, điều này có ý nghĩa hơn.
MontyPython

1
Tôi nghĩ rằng mọi người chỉ đơn giản là không hiểu rằng bạn đã cung cấp một ví dụ về "kết hợp tất cả" và giải pháp cho câu hỏi với trường ORDER BY. Vì vậy, những người phản đối, đó chỉ là do sự kém cỏi.
John

Tôi kiểm tra tất cả các câu trả lời của mình bằng cách ghi nhớ bài đăng của @ Strawberry - meta.stackoverflow.com/questions/333952/… .
MontyPython

2

Bạn có thể sử dụng field()trong MySQL.

select id,name from friends order by field(id,5,id)

Tham số đầu tiên trong trường () có nghĩa là trường bạn muốn sắp xếp, phần còn lại là sắp xếp.

Vì vậy, 5 sẽ được sắp xếp đầu tiên, và phần còn lại từ id (không có 5). Bạn có thể làm như field(id,5,1,3,id)nếu bạn muốn 5,1,3 ở phía trước.

5 có thể được chọn để sắp xếp cuối cùng field(id,id,5). Id thứ 2 cũng sẽ loại trừ 5 khỏi nó.


-7

Điều này hơi xấu vì nó có sự trùng lặp mã, nhưng nó thực hiện được mẹo:

select .... where id = 5 
union
select .... where not id = 5

2
Nếu các hàng vẫn được sắp xếp theo thứ tự sau khi hợp nhất, đó chỉ là một sự cố. Và nếu bạn chỉ định một order by, nó sẽ sắp xếp toàn bộ liên hiệp.
Andomar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.