查找表中的记录,该表在另一个表中的关联记录中没有具有特定字段值的记录

时间:2014-09-07 21:52:54

标签: mysql

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

为了更好地解释这里的例子:

表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的记录:在上面的小例子中#34;表A.record 2& #34;,因为在"表A.记录1"的相关记录中那里"表B.记录2"哪个名称的字段等于cat。

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

2 个答案:

答案 0 :(得分:0)

我试图理解这一点,但有点麻烦,这里有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"

我希望这就是你要找的东西。要记住的一件事是,如果您要对这些列进行过滤,请确保正确编制索引表。您可能看不到小数据的任何延迟,但随着它的增长,查询将因此类查找而变慢。

答案 1 :(得分:0)

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

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

这将选择B中猫的所有记录,但是当找不到与A中的记录匹配的猫时,它将为B的所有字段选择空(这是左连接的作用) 。然后where子句只选择那些找不到匹配B的记录,只留下A中没有找到猫的记录。选择A. *确保你没有得到B中的列。无论如何都必须为null。