找到第二列值时,根据列值排除行

时间:2014-02-22 16:07:09

标签: mysql sql

我已经尝试过搜索这个并且我不太确定如何准确地说出我所追求的内容,但我将展示我所拥有的和我想要的东西。这也是我在这里的第一个问题,所以如果我弄错了,我道歉!

首先,我有这个带有外键的链接表:

|ID|Value|
+--+-----+
|1 |   70|
|1 |  130|
|2 |   60|

现在,我正试着向我展示Value!=70这个表中的所有ID。我试过了;

SELECT * FROM table WHERE Value != 70

这会删除70值,现在会显示行1:1302:60。但是,如何排除匹配的列中的所有值。例如。如果我说没有向我显示任何与其关联的值70的ID,我应该只获得ID为2的行。我试过了;

SELECT DISTINCT * FROM table WHERE Value != 70

SELECT * FROM table WHERE Value != 70 GROUP BY ID

SELECT DISTINCT * FROM table WHERE Value != 70 GROUP BY ID

但这些都不起作用。就像我说的那样,我不确定如何说出我所追求的内容,但任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:4)

Select * From table 
where id Not In 
        (Select distinct id 
         From table
         Where value = 70)

Select * From table t
where Not exists
        (Select * From table
         where id = t.id
            and value = 70)   

答案 1 :(得分:0)

您可以使用子查询和NOT IN条件

SELECT tb.* FROM table tb
WHERE tb.ID NOT IN 
(
    SELECT a.ID FROM table a where a.Value = 70
)

答案 2 :(得分:0)

我不知道我是否理解你,但也许这个?

SELECT * FROM table WHERE ID NOT IN (
  SELECT ID FROM table WHERE Value = 70
)

我使用'NOT IN'而不是!=,因为它可能是多个ID,其关联值为70.

你也可以使用:

SELECT * FROM table t1 WHERE NOT EXISTS(
  SELECT 1 FROM table t2 WHERE t2.ID = t1.ID AND t2.value = 70
)

答案 3 :(得分:0)

您的第二次尝试非常接近解决此问题的一种方法。 where子句只需要更改为having子句(以及对逻辑的小改动):

SELECT ID
FROM table t
GROUP BY ID
HAVING sum(Value = 70) = 0;

having子句中的表达式计算value等于70的行数。您不需要这样的行,因此= 70。这种形式的查询非常灵活。使用having子句,您可以检查更复杂的条件,例如没有7071

HAVING sum(Value = 70) = 0 AND
       sum(Value = 71) = 0;

或者没有70但是71

HAVING sum(Value = 70) = 0 AND
       sum(Value = 71) > 0;

更复杂的组合。