获取NOT值的所有行,不带子查询

时间:2016-08-16 15:23:59

标签: mysql sql

我们说我有一张这样的表

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)。

请帮助。

2 个答案:

答案 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

SQL FIDDLE EXAMPLE

请注意,如果每个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