Thứ tự Mysql theo các giá trị ID cụ thể


95

Có thể sắp xếp trong mysql theo "order by" bằng cách sử dụng tập hợp giá trị cột (ID) được xác định trước như: order theo (ID = 1,5,4,3) không vì vậy tôi sẽ nhận được bản ghi 1, 5, 4, 3 trong đó ra lệnh?

CẬP NHẬT: Về việc lạm dụng mysql ;-) Tôi phải giải thích lý do tại sao tôi cần cái này ...

Tôi muốn hồ sơ của mình thay đổi sắp xếp ngẫu nhiên sau mỗi 5 phút. Tôi có một nhiệm vụ cron để làm bảng cập nhật để đặt các thứ tự sắp xếp ngẫu nhiên, khác nhau trong đó. Chỉ có một vấn đề! TẠP CHÍ. Tôi sẽ có một khách truy cập vào trang của tôi và tôi cho anh ta 20 kết quả đầu tiên. Anh ta sẽ đợi 6 phút và chuyển sang trang 2 và anh ta sẽ có kết quả sai vì thứ tự sắp xếp đã thay đổi.

Vì vậy, tôi nghĩ rằng nếu anh ta đến trang web của tôi, tôi đặt tất cả ID vào một phiên và khi anh ta ở trang 2, anh ta sẽ nhận được các bản ghi chính xác ngay cả khi việc sắp xếp đã thay đổi.

Có cách nào khác, tốt hơn, để làm điều này không?


Bạn đang hỏi liệu có cách nào mysql có thể đặt hàng theo thứ tự cụ thể không?
stefgosselin vào

1
Nghe có vẻ như một trong hai mô hình dữ liệu của bạn bị hỏng / không đầy đủ ( nơi không theo thứ tự này đến từ đâu?) Hoặc cách khác bạn đang lạm dụng MySQL.
derobert

Câu trả lời:


202

Bạn có thể sử dụng chức năng ORDER BY và FIELD. Xem http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

Nó sử dụng hàm Field () , "Trả về chỉ số (vị trí) của str trong danh sách str1, str2, str3, .... Trả về 0 nếu không tìm thấy str" theo tài liệu. Vì vậy, thực sự bạn sắp xếp tập kết quả theo giá trị trả về của hàm này là chỉ số của giá trị trường trong tập hợp đã cho.


Tôi dường như không thể làm cho điều này hoạt động mà không sử dụng: WHERE ID IN (1,5,4,3)
TV-C-15

làm thế nào bạn sẽ sử dụng điều này với giá trị Không có?
Nono London

30

Bạn sẽ có thể sử dụng CASEcho việc này:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

Trên tài liệu chính thức cho mysql về ORDER BY , ai đó đã đăng mà bạn có thể sử dụng FIELDcho vấn đề này, như thế này:

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

Đây là mã chưa được kiểm tra mà về lý thuyết sẽ hoạt động.


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

Ví dụ, nếu tôi có 10 đăng ký, theo cách này, ID 1, 5, 4 và 3 sẽ xuất hiện đầu tiên, các đăng ký khác sẽ xuất hiện tiếp theo.

Hiệu ứng thông thường 1 2 3 4 5 6 7 8 9 10

Với cách này

8 5 4 3 1 2 6 7 9 10


Ok Cảm ơn vì lời khuyên
Bruno Mangini Alves

6

Có một cách khác để giải quyết vấn đề này. Thêm một bảng riêng biệt, giống như sau:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

Bảng này bây giờ sẽ được sử dụng để xác định cơ chế đặt hàng của riêng bạn.

Thêm các giá trị của bạn vào đó:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

... và sau đó sửa đổi câu lệnh SQL của bạn trong khi tham gia bảng mới này.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

Giải pháp này hơi phức tạp hơn các giải pháp khác, nhưng sử dụng giải pháp này, bạn không phải thay đổi SELECTtuyên bố của mình bất cứ khi nào tiêu chí đặt hàng của bạn thay đổi - chỉ cần thay đổi dữ liệu trong bảng đơn hàng.


0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
Bạn có thể giải thích thêm không? Điều này có vẻ tương tự như câu trả lời được chấp nhận, nhưng tôi không nghĩ rằng ASC OR DESClà cú pháp thích hợp
Nico Haase

@NicoHaase sự khác biệt giữa ASC và DESC là nếu bạn sử dụng asc thì id bạn sử dụng chức năng trường sẽ đi cuối cùng và nếu bạn sử dụng DESC sau đó id trong hàm lĩnh vực sẽ đến đầu tiên
Hisham Shahid

@NicoHaase bạn có thể sử dụng ASC hoặc DESC với truy vấn hoặc là một accroding yêu cầu
Hisham Shahid

Vì vậy, bạn không thể sử dụng cả hai trong một truy vấn. Nico là tôi nghĩ rằng đề nghị bạn thực hiện câu trả lời của bạn chính xác về mặt cú pháp. Tôi khá chắc rằng anh ấy đã quen với ASD và DESC thực sự có nghĩa là gì :)
RiggsFolly

0

Nếu bạn cần đặt một id duy nhất trước trong kết quả, hãy sử dụng id.

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

Nếu bạn cần bắt đầu với một chuỗi nhiều id, hãy chỉ định một tập hợp, tương tự như những gì bạn sẽ sử dụng với một INcâu lệnh.

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

Thêm một số mô tả khác
Mathews Sunny

nếu bạn muốn sử dụng để do cho chỉ có một id sau đó sử dụng 1 st truy vấn và nếu bạn muốn cho nhiều id sau đó sử dụng truy vấn 2
Rajesh Kharatmol

0

Nếu bạn muốn sắp xếp một id cuối cùng trong kết quả, hãy sử dụng thứ tự theo trường hợp. (Ví dụ: bạn muốn tùy chọn "khác" ở cuối cùng và tất cả danh sách thành phố hiển thị theo thứ tự bảng chữ cái.)

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

Ví dụ: nếu tôi có 5 thành phố, tôi muốn hiển thị thành phố theo thứ tự bảng chữ cái với tùy chọn "khác" hiển thị cuối cùng trong menu thả xuống thì chúng tôi có thể sử dụng truy vấn này. xem ví dụ khác đang hiển thị trong bảng của tôi ở id thứ hai (id: 2), vì vậy tôi đang sử dụng "khi id = 2" trong truy vấn ở trên.

ghi trong bảng DB:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

đầu ra của tôi:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
Cố gắng thêm một số giải thích vào mã của bạn, nó sẽ làm cho câu trả lời của bạn rõ ràng và dễ hiểu hơn. Vui lòng đọc stackoverflow.com/help/how-to-answer
32cupo

nếu bạn muốn sử dụng thứ tự theo chỉ một id (Ví dụ: bạn muốn tùy chọn "khác" ở cuối cùng và tất cả danh sách thành phố hiển thị theo thứ tự bảng chữ cái.) để bạn có thể sử dụng truy vấn này. nó làm việc cho tôi.
Preeti
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.