2016-06-28 27 views
5

aşağıdaki SQL sorgu var:SQL Sorgusu - VAKA Beklenmedik Token

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 

Bu ikinci sunucuda, benim ilk sunucuda çalışıyor ama bana biraz benzer baktım

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

verir sorunlar ama hala çözüm bulunamadı. Sorun şu ki CASE.

Herkes bana yardımcı olabilir mi? Herhangi bir yardım çok takdir edilecektir. Şimdiden teşekkürler.

cevap

3

CASE hatalı, CASE bir ifadedir, yalnızca bir değer değil, THEN bir koşul belirtin, bir koşul değil. Buna

Değişim it: @Jarlh önerdi gibi

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

, sen OR kullanabilirsiniz s biraz daha iyi sorgu optimize edilebilir:

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

YA-ed koşulları davayı değiştirin olurdu daha iyi. (Optimize etmeyi kolaylaştırır.) – jarlh

+2

"Çalışır" çünkü MySQL, aslında 0 veya 1 döndüren boolean ifadeleri yapar. Bu, başka bir DBMS'de görmediğim bir şeydir. (İkinci mesajın aslında MySQL olmadığı, çünkü hata mesajının böyle görünmediği sanılmayacaktı.) –