2016-06-28 14 views
5

Mam następujący SQL zapytania:SQL Query - SPRAWA Nieoczekiwany Reklamowe

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 

To działa dobrze na moim pierwszym serwerze, ale na drugim serwerze, daje mi

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

spojrzał na jakiś podobny problemy, ale wciąż nie znaleziono rozwiązania. Wydaje się, że problem jest następujący: CASE.

Czy ktoś może mi pomóc? Każda pomoc byłaby bardzo cenna. Z góry dziękuję.

Odpowiedz

3

You CASE jest źle, CASE jest wyrażeniem, a nie instrukcją, można określić tylko wartość w THEN, a nie warunek.

zmienić go na to:

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

Jak @Jarlh zasugerował, można użyć OR s, które mogą optymalizować zapytania nieco lepiej:

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

Wymień sprawę z warunków OR-ed byłoby nawet lepiej. (Łatwiej zoptymalizować.) – jarlh

+2

"Działa", ponieważ MySQL sprawia, że ​​wyrażenia boolowskie faktycznie zwracają 0 lub 1. To jest coś, czego nie widziałem w żadnym innym DBMS. (Nie byłbym zaskoczony, że drugi serwer nie jest w rzeczywistości MySQL, ponieważ komunikat o błędzie nie wygląda na taki). –