2016-06-28 6 views
5

私は、次のSQL問い合わせてきた:SQLクエリ - CASE予期しないトークン

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 

それは、第二のサーバ上で、私の最初のサーバー上で正常に動作しますが、私にいくつかの類似した見

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

を与えます問題は解決されていません。 問題はCASEと思われます。

誰でもお手伝いできますか?どんな助けでも大歓迎です。前もって感謝します。

答えて

3

CASEが間違っています。CASEは式ではなく、条件ではなくTHENの値のみを指定できます。あなたは少し良いクエリを最適化することができるORの使用することができます

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

@Jarlhが提案のように、::

これに変更し、それをOR-EDの条件でケースを交換し

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

は次のようになりますさらに良い。 (より簡単に最適化できます) – jarlh

+2

MySQLはブール式を実際に0または1にするため、「動作」します。これは他のDBMSでは見たことのないものです。 (私は、2番目のサーバが実際にはMySQLではないことに驚いていません。なぜなら、エラーメッセージはそれに似ていないからです。) –

関連する問題