【问题标题】:Find records from a table that, among associated records in another table, don't have a record with a specific field value从一个表中查找在另一个表的关联记录中没有具有特定字段值的记录的记录
【发布时间】:2014-09-09 02:49:09
【问题描述】:

有没有办法在一个查询中找到一个表中的所有记录,而另一个表的关联记录中没有具有特定字段值的记录?

为了更好地解释这里是一个例子:

A表中的一条记录在B表中有很多条记录,B表中的每条记录都属于A表中的一条记录(N:1)

Table A:
record 1(id: 1, name: happy)
record 2(id: 2, name: sad)

Table B:
record 1(id:1, name: dog, table_a_id: 1)
record 2(id:2, name: cat, table_a_id: 1)
record 3(id:3, name: mouse, table_a_id: 1)
record 4(id:4, name: dog, table_a_id: 2)
record 6(id:6, name: mouse, table_a_id: 2)

我想获取表A中没有的记录,在表B的关联记录中,名称为:cat的记录,在上面的小例子“表A.record 2”中,因为在关联的“Table A.record 1”的记录有“Table B.record 2”,其名称的字段等于cat。

感谢您的帮助, 加布里埃尔

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用左连接并检查连接表中的空值:

    SELECT A.* FROM A
    LEFT JOIN B ON A.id = B.table_a_id AND B.name = 'cat'
    WHERE B.id IS NULL
    

    这将选择 A 中的所有记录以及 B 中的猫,但是当找不到与 A 中的记录匹配的猫时,它将为 B 的所有字段选择 null(这就是左连接所做的)。然后 where 子句只选择那些没有找到匹配 B 的记录,只留下 A 中没有在 B 中找到猫的记录。选择 A.* 确保您没有从 B 中获取绑定到的列无论如何都是空的。

    【讨论】:

    • 谢谢。这看起来不错,我现在就试试,我不确定的部分是:“AND B.name 'cat'”,我之前所做的详细说明是将该部分放在 WHERE 子句之后(就像那样: SELECT A.* FROM A LEFT JOIN B ON A.id = B.table_a_id WHERE B.id IS NULL AND B.name 'cat',但它不起作用......感谢扭曲^_^和解释。
    • 好的,它有效,我只需将 替换为 =,这给了我预期的结果:SELECT A.* FROM A LEFT JOIN B ON A.id = B.table_a_id AND B.name = 'cat' WHERE B.id IS NULL,结果是 A 中根本没有关联 B 表或有关联 B 表但 name='cat' 的所有记录
    • 是的,首先应该是 =,我的错。为了更好地衡量,我确定了答案......
    【解决方案2】:

    我试图理解这一点,但遇到了一点麻烦,这里有 2 个查询:

    此查询将返回 a 和 b 表的连接,不包括名称为“cat”的记录:

    SELECT *
    FROM table_a AS a
    JOIN table_b AS b
    ON a.id = b.table_a_id
    WHERE b.name != "cat"
    

    并且此查询将只返回名称为“cat”的记录:

    SELECT *
    FROM table_a AS a
    JOIN table_b AS b
    ON a.id = b.table_a_id
    WHERE b.name = "cat"
    

    我希望这就是您想要的。要记住的一件事是,如果您要过滤这些列,请确保您的表已正确索引。您可能看不到小数据有任何滞后,但随着数据的增长,这种查找方式的查询速度会变慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多