2016-06-28 24 views
5

Tôi có SQL truy vấn sau đây:SQL Query - TRƯỜNG HỢP bất ngờ Mã

SELECT w.id, w.name, m.subject, m.id 
FROM users AS w, i_c AS c, 
(SELECT _id, u_id, subject FROM i_m WHERE (_id, tmstmp) IN 
     (SELECT _id, max(tmstmp) FROM i_m GROUP BY _id)) m 
     WHERE (c.uid_1 = '2' OR c.uid_2 = '2') AND 
     CASE WHEN c.uid_1 = '2' THEN w.id = c.uid_2 
     WHEN c.uid_2 = '2' THEN w.id = c.uid_1 END 
     AND (c.id = m.id) ORDER BY m.tmstmp DESC 

Nó hoạt động tốt trên máy chủ đầu tiên của tôi, nhưng, trên một máy chủ thứ hai, mang lại cho tôi

Unexpected Token. (near "c" at position 280) 

Nhìn một số tương tự vấn đề nhưng vẫn không tìm thấy giải pháp. Dường như sự cố là CASE.

Có ai có thể giúp tôi không? Bất kì sự trợ giúp nào đều được đánh giá cao. Cảm ơn trước.

Trả lời

3

Bạn CASE là sai, CASE là một biểu thức, không phải là tuyên bố, bạn chỉ có thể chỉ định giá trị trong THEN, không phải là điều kiện.

Thay đổi nó như thế này:

 w.id = CASE WHEN c.uid_1 = '2' THEN c.uid_2 
        WHEN c.uid_2 = '2' THEN c.uid_1 
       END 

Giống như @Jarlh gợi ý, bạn có thể sử dụng OR s có thể tối ưu hóa các truy vấn tốt hơn một chút:

WHERE ((c.uid_1 = '2' AND w.id = c.uid_2) OR 
     (c.uid_2 = '2' AND w.id = c.uid_1)) AND 
+2

Replace trường hợp với điều kiện OR-ed sẽ thậm chí còn tốt hơn. (Dễ dàng hơn để tối ưu hóa.) – jarlh

+2

Nó "hoạt động" bởi vì MySQL làm cho các biểu thức boolean thực sự trở về 0 hoặc 1. Đó là một cái gì đó tôi đã không nhìn thấy trong bất kỳ DBMS khác. (Tôi sẽ không ngạc nhiên khi máy chủ thứ hai không thực sự là MySQL, vì thông báo lỗi không giống như nó.) –

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