2009-09-03 23 views

Trả lời

20

Bạn có thể làm điều đó bằng FIND_IN_SET, ví dụ

SELECT * FROM T WHERE T.id IN(4,78,12,45) 
ORDER BY FIND_IN_SET(T.id,'4,78,12,45'); 

Trong khi bạn phải sao chép danh sách, nếu bạn đang tạo truy vấn trong mã thì đây không phải là vấn đề lớn.

+0

+1 để dạy tôi điều gì đó mà tôi không biết về MySQL! – Welbog

+0

+1 đẹp và sạch sẽ! tôi thích nó, muốn máy chủ sql đã có nó. –

+0

Đối với các trường hợp nhỏ như thế này, điều này sẽ khá hiệu quả, nhưng nếu danh sách lựa chọn của bạn là lớn, tôi sẽ tưởng tượng rằng cách tiếp cận bảng tạm thời sẽ hiệu quả hơn. –

1

Trong trường hợp chung, bạn không thể. SQL không bảo đảm thứ tự trừ khi bạn sử dụng mệnh đề ORDER BY và nó không thể được gắn vào nội dung của câu lệnh IN.

Tuy nhiên, nếu bạn có thể tạo bảng tạm thời đặt hàng các giá trị bạn đang chọn, bạn có thể tham gia trên bảng đó và sắp xếp theo thứ tự đó.

Ví dụ, bạn có một bảng tạm thời có chứa một cái gì đó như sau:

id | order 
----+------ 
4 | 1 
78 | 2 
12 | 3 
45 | 4 

Sau đó, bạn có thể đặt nó như thế này:

SELECT T.* 
FROM T 
INNER JOIN temp 
ON T.id = temp.id 
ORDER BY temp.order ASC 
+0

trong khi tôi thích sự sạch sẽ của giải pháp Paul Dixon cung cấp. Điều này có thể dễ hiểu hơn và thậm chí có thể nhanh hơn. –

0

Bạn không thể đặt hàng theo mệnh đề IN. Bạn phải cung cấp một mệnh đề ORDER BY riêng. Một cách để làm điều này là như sau bằng cách xây dựng một tuyên bố trường hợp trong ORDER BY. Nó không phải là khá mặc dù.

SELECT 
    * 
FROM 
    T 
WHERE 
    T.Id IN(4, 78, 12, 45) 
ORDER BY 
    CASE 
     WHEN T.Id = 4 THEN 1 
     WHEN T.Id = 78 THEN 2 
     WHEN T.Id = 12 THEN 3 
     WHEN T.Id = 45 THEN 4 
    END 
Các vấn đề liên quan