Ví dụ: chọn * từ T trong đó T.id IN (4,78,12,45)Mệnh đề 'IN' của MySQL và đơn đặt hàng bản ghi trả về
Tôi muốn bản ghi trả lại chỉ được sắp xếp theo vị trí trong mệnh đề 'IN'. Tôi có thể làm như thế nào?
Ví dụ: chọn * từ T trong đó T.id IN (4,78,12,45)Mệnh đề 'IN' của MySQL và đơn đặt hàng bản ghi trả về
Tôi muốn bản ghi trả lại chỉ được sắp xếp theo vị trí trong mệnh đề 'IN'. Tôi có thể làm như thế nào?
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.
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
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. –
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
+1 để dạy tôi điều gì đó mà tôi không biết về MySQL! – Welbog
+1 đẹp và sạch sẽ! tôi thích nó, muốn máy chủ sql đã có nó. –
Đố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. –