2010-04-10 3 views
17

chuỗi truy vấn của tôi là như sau:Làm thế nào để tạo kết quả truy vấn MYSQL ORDER BY điều kiện đặt hàng?

SELECT ... FROM maintable 
LEFT JOIN table1 on (maintable.id = table1.idx) 
LEFT JOIN table2 on (table1.idy = table2.idy) 
LEFT JOIN table3 on (table2.idz = table3.idz) 
WHERE (condition1 OR condition2 OR condition3) 
AND maintable.status = static 

//condition1 & condition2 & condition3 are kind of 
table3.idz = 101, table3.idz = 3, maintable.id IN (1,2,3,4), and so on 

Đối với kết quả tôi muốn mục mà đáp ứng condition1 để được trả lại đầu tiên, sau đó mục mà đáp ứng condition2, và cuối cùng mục mà đáp ứng condition3. Ý tưởng nào?

+1

Các điều kiện của bạn có khác biệt không? Nếu không, nếu một mục nhập đáp ứng nhiều điều kiện thì sao? Ví dụ: nếu mục nhập đáp ứng các điều kiện 1 và 3, thì mục nhập đó phải được sắp xếp như thế nào so với mục nhập đáp ứng các điều kiện 1 và 2? –

+0

không có giới hạn ở đây, vì vậy tôi nghĩ rằng có lẽ đầu tiên đáp ứng trở lại đầu tiên? – Edward

Trả lời

24

Để có được sắp xếp theo thứ tự bạn muốn, sử dụng điều kiện của bạn trong ORDER BY, nhưng sử dụng DESC sau họ.

SELECT * 
FROM person 
WHERE (condition1 OR condition2 OR condition3) 
AND maintable.status = static 
ORDER BY 
    condition1 DESC, 
    condition2 DESC, 
    condition3 DESC 

Nếu điều này không làm việc vì truy vấn của bạn là phức tạp hơn, sau đó bạn có thể sử dụng logic boolean thay đổi truy vấn của bạn (A OR B OR C) AND D vào (A AND D) OR (B AND D) OR (C AND D) sau đó bạn có thể sử dụng các truy vấn sau đây:

SELECT * 
FROM person 
WHERE (condition1 OR condition2 OR condition3) 
AND maintable.status = static 
ORDER BY 
    condition1 AND static DESC, 
    condition2 AND static DESC, 
    condition3 AND static DESC 

Các AND static là không cần thiết ở đây vì tất cả các hàng trả về nó, nhưng trong một ví dụ phức tạp hơn (nơi bạn cũng trả về một số hàng không tĩnh) thì bạn sẽ phải làm theo cách này.

+1

+1 để nhận ra rằng 'DESC' là cần thiết! –

+0

làm thế nào về điều kiện (tôi có chuỗi truy vấn của tôi được cập nhật) giống như table.id = 123? Tôi đã thử ORDER BY câu, nhưng không có hiệu lực. – Edward

+0

@Relax: Ví dụ tôi đưa ra trước đây sẽ hoạt động tốt. Tôi vẫn cập nhật nó vì tôi đoán rằng truy vấn thực sự của bạn phức tạp hơn bạn sẽ cho phép chúng tôi biết. –

7

này nên làm việc:

ORDER BY condition1, condition2, condition3 

ví dụ

ORDER BY (weight > 500), (height > 3), (height < 2) 
+0

cảm ơn, nhưng nó không hoạt động, có thể vì chuỗi truy vấn thực tế của tôi phức tạp hơn, tôi có nó được cập nhật – Edward