2016-06-28 35 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中指定一个值,而不是一个条件。

它改成这样:

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

像@Jarlh建议,你可以使用OR S的可优化查询稍好:

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

与OR-ED条件更换的情况下将甚至更好。 (更容易优化。) – jarlh

+2

它“有效”,因为MySQL使布尔表达式实际上返回0或1.这是我在任何其他DBMS中没有看到的。 (我不会惊讶第二台服务器实际上不是MySQL,因为错误信息看起来不像。) –