WHERE子句中的MYSQL CASE语句和WHERE语句中的IS NULL附加LEFT OUTER JOIN

时间:2014-02-11 06:09:23

标签: mysql sql

我已经设置了一个简单的小提示来演示我的例子。

http://sqlfiddle.com/#!2/b7c813/7/0

有一张人员表和一张答案表。出于演示的目的,它们已被简化为此特定查询所需的列。

我理想的最终结果集看起来与上面提到的结果相似。

person_id, name, took_form_14, took_form_15

然而,我想要的是,只有那些选择14或者15的形式的人,或者不是15或者15的形式,而不是两者的两者(两列都是真的)。​​

我认为我可以使用额外的WHERE子句来简单地将这些结果返回到NULL,但我似乎无法确定删除take_form_14和took_form_15这两种情况的语法真。

当我尝试时,我收到了这个错误:

Invalid use of group function: 
SELECT p.*, 
MAX(CASE WHEN form_id = 14 THEN 'true' ELSE 'false' END) AS took_form_14, 
MAX(CASE WHEN form_id = 15 THEN 'true' ELSE 'false' END) AS took_form_15 
FROM people p 
LEFT JOIN answers a ON a.person_id = p.id 
WHERE( 
    MAX(CASE WHEN form_id = 14 THEN 'true' ELSE 'false' END) = 'false' 
    OR 
    MAX(CASE WHEN form_id = 15 THEN 'true' ELSE 'false' END) = 'false' ) 
GROUP BY p.id

我哪里错了?

另外,有人可以解释为什么我需要在我的case语句之前使用MAX函数,或者我得到不同的结果?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要使用HAVING而不是其他地方。

这样的东西
SELECT p.*,
  MAX(CASE WHEN form_id = 14 THEN 'true' ELSE 'false' END) AS took_form_14,
  MAX(CASE WHEN form_id = 15 THEN 'true' ELSE 'false' END) AS took_form_15
FROM people p
LEFT JOIN answers a ON a.person_id = p.id OR a.person_id IS NULL
GROUP BY p.id
HAVING took_form_14 = 'false' OR took_form_15 = 'false'

SQL Fiddle DEMO