MySQL只返回另一个表中不存在列的行

时间:2014-02-08 06:59:45

标签: php mysql

MySQL表:

Table Name: basicdetails
id,firstname,lastname,hometown
1,bob,dylan,somewhere
2,judge,judy,somewhere

Table Name: fulldetails
id,firstname,lastname,age,gender,eyes,hometown
1,bob,dylan,51,m,blue,somewhere
2,bob,dylan,22,m,green,somewhereelse
3,judge,judy,19,f,blue,somewhere
4,judge,judy,62,f,blue,somewherenicer
5,bob,dylan,31,m,blue,somewhere

预期结果是一个比较,它仅返回来自fulldetails的条目,这些条目不是基于其firstname,lastname和hometown的基本细节。

在这种情况下,它将是:

bob,dylan,somewhereelse
judge,judy,somewherenicer

我更擅长编写MySQL查询的PHP,所以我的所有尝试都是关于创建独特的数组并尝试对它们进行排序。它非常复杂而且非常慢,所以我想也许有可能只根据它们(名字,姓氏,家乡)获得两者中不存在的条目。是否有一种特定的方法可以返回MySQL中同时存在于两个表中的唯一值(如果有所不同,则返回MySQLi)?

我对这方面的措辞表示道歉,我无法正确写字。

1 个答案:

答案 0 :(得分:2)

反连接是一种熟悉的模式。

您已经知道如何查找匹配的行:

SELECT a.*
  FROM a
  JOIN b
    ON a.firstname = b.firstname
   AND a.lastname  = b.lastname
   AND a.hometowm  = b.hometown

要获取不匹配的行集,我们可以使用OUTER连接(以便返回a中的所有行),以及来自b的匹配行。

SELECT a.*
  FROM a
  LEFT
  JOIN b
    ON a.firstname = b.firstname
   AND a.lastname  = b.lastname
   AND a.hometowm  = b.hometown

现在的“技巧”是过滤掉所有匹配的行。我们可以通过添加WHERE子句来做到这一点,WHERE子句是一个测试是否找到匹配的谓词。一个方便的方法是测试b中的列是否为NULL,b中的列,如果找到匹配,我们知道 not 是NULL:

SELECT a.*
  FROM a
  LEFT
  JOIN b
    ON a.firstname = b.firstname
   AND a.lastname  = b.lastname
   AND a.hometowm  = b.hometown
 WHERE b.firstname IS NULL