Mysql SQL查询-大小写意外标记

Mysql SQL查询-大小写意外标记,mysql,sql,case,Mysql,Sql,Case,我有以下SQL查询: 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

我有以下
SQL
查询:

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)
研究了一些类似的问题,但仍然没有找到解决方案。 问题似乎是
案例


有人能帮我吗?任何帮助都将不胜感激。提前感谢。

您的
案例
是错误的,
案例
是一个表达式,而不是一个语句,您只能在
然后
中指定一个值,而不是一个条件

将其更改为:

       w.id = CASE WHEN c.uid_1 = '2' THEN c.uid_2 
                   WHEN c.uid_2 = '2' THEN c.uid_1
              END 
就像@Jarlh建议的那样,您可以使用
s,这可以稍微优化查询:

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

如果换一个或多个条件,情况会更好。(更容易优化。)它“有效”,因为MySQL使布尔表达式实际上返回0或1。这是我在其他数据库管理系统中没有看到的。(如果第二台服务器不是MySQL,我也不会感到惊讶,因为错误消息看起来不像MySQL。)