我们说我有一张这样的表
Id item_id type_id date
1 1 1 2016-08-11
2 2 2 2016-08-12
3 2 3 2016-08-13
4 3 4 2016-08-14
5 4 3 2016-08-15
6 2 3 2016-08-16
如您所见,我的id为2的项目有2种类型(type_id 2和3)。如何在不使用子查询的情况下获取非类型3的所有项(item_id)。例如,预期结果应为:
Id item_id type_id date
1 1 1 2016-08-11
4 3 4 2016-08-14
如果我编写以下SQL语句:
SELECT * FROM my_table WHERE type_id <> 3 GROUP BY item_id;
上面的语句也返回类型2(因为它在表中的行也不是类型3)。
请帮助。
答案 0 :(得分:1)
您可以计算item_id的type_id为3的次数,并且只选择计数为0的那些
SELECT `Id`, `item_id`, `type_id`, `date`
FROM MyTable
GROUP BY item_id
HAVING COUNT(CASE WHEN type_id = 3 THEN 1
END) = 0
请注意,如果每个item_id有多个记录,则按item_id分组只会为您提供结果中的一条记录。
答案 1 :(得分:1)
SELECT DISTINCT t1.*
FROM
my_table t1
LEFT JOIN my_table t2
ON t1.item_id = t2.item_id
AND t2.type_id = 3
WHERE
t2.id IS NULL
如果item_id到type_id组合从不重复,则不需要DISTINCT
证明它有效的SQL小提琴http://sqlfiddle.com/#!9/c49e1d/4/0