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)?
我对这方面的措辞表示道歉,我无法正确写字。
答案 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