2009-08-26 28 views
53

Tôi có một mảng PHP với số ID trong đó. Những con số này đã được đặt hàng.Đơn đặt hàng MySQL CỦA IN()

Bây giờ tôi muốn nhận kết quả của mình thông qua phương thức IN(), để nhận tất cả ID.

Tuy nhiên, các ID này phải được đặt hàng như trong phương thức IN.

Ví dụ:

IN(4,7,3,8,9) 

nên cho một kết quả như:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

Bất kỳ lời đề nghị? Có lẽ có một chức năng để làm điều này?

Cảm ơn!

+0

Các dữ liệu khác được liên kết với những con số đó là gì? Nó có thể cho chúng ta một đầu mối tại sao bạn muốn nó theo thứ tự đó. – Randell

Trả lời

125

tôi nghĩ rằng bạn có thể tìm kiếm chức năng FIELD - trong khi thường nghĩ đến như một hàm chuỗi, nó hoạt động tốt cho số lượng, quá!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

Chính xác. Tôi chỉ đang tìm trong Sách dạy nấu ăn MySQL của Paul Dubois và tìm thấy nó: CHỌN id, tên TỪ bài viết WHERE id IN (7,4,21) TỰ DO FIELD (id, 7,4,21) Cảm ơn! –

+0

Darn bạn mọi người đang nhanh chóng. ;-) – deceze

+0

@ Henk, rất vui khi được giúp bạn, nhưng sự chấp nhận với một sự nổi lên là một sự xuất hiện đặc biệt trên SO - bất kỳ lý do gì bạn không đưa ra cho tôi? -) –

-3

Bạn chỉ cần đưa ra thứ tự đúng theo câu lệnh.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

Tại sao bạn muốn đặt dữ liệu của mình theo thứ tự không giống như trong ví dụ?

Nếu bạn không nhớ concatening các truy vấn dài, hãy thử theo cách đó:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

Cảm ơn. Nhưng điều này sẽ không làm các thủ thuật: SELECT id, tên TỪ bài viết WHERE id IN (7,4,21) ORDER BY id Nên hiển thị 7,4,21. Nhưng thay vào đó nó sẽ hiển thị: 4,7,21 ... –

+2

Công đoàn * không * lệnh bảo đảm. – paxdiablo

+0

Phải, do đó cảnh quay thứ hai của tôi, sẽ đưa ra 'thứ tự' mong muốn nhưng không phải là thứ ngọt ngào nhất. –

0

chuẩn SQL không cung cấp một cách để làm điều này (MySQL có thể, nhưng tôi thích các giải pháp mà nhà cung cấp trung lập vì vậy tôi có thể chuyển đổi DBMS 'bất kỳ lúc nào).

Đây là điều bạn nên làm sau khi xử lý sau tập kết quả được trả về. SQL chỉ có thể trả lại chúng theo thứ tự được chỉ định trong mệnh đề "order by" (hoặc trong bất kỳ yêu cầu nào nếu không có mệnh đề như vậy).

Khả năng khác (mặc dù tôi không thích nó, tôi rất vinh dự cho bạn lựa chọn) là thực hiện nhiều chuyến đi đến cơ sở dữ liệu, một cho mỗi ID và xử lý chúng khi chúng đến:

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

Bạn có thể làm điều đó trong SQL tiêu chuẩn bằng cách sử dụng 'CASE col WHEN * 1st-val * THÌ 1 KHI * 2-val * THEN 2 ... END' – derobert

+1

... không phải tôi muốn giới thiệu một điều như vậy! – derobert

8

Bạn có thể sử dụng FIELD():

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

Trả về chỉ số (vị trí) của str trong str1, str2, str3, ... danh sách. Trả về 0 nếu không tìm thấy str.

Đây là loại hack xấu xí, vì vậy thực sự chỉ sử dụng nếu bạn không còn lựa chọn nào khác. Sắp xếp đầu ra trong ứng dụng của bạn có thể tốt hơn.

Các vấn đề liên quan