簡體   English   中英

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

[英]MySQL return only rows that's columns don't exist in another table

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

預期結果是一個比較,它僅返回完整詳細信息中的條目,這些條目不是基於其firstname,lastname和hometown的基本詳細信息。

在這種情況下,它將是:

bob,dylan,somewhereelse
judge,judy,somewherenicer

我更擅長編寫MySQL查詢的PHP,所以我所有的嘗試都是關於創建獨特的數組並嘗試對它們進行排序。 它非常復雜而且非常慢,所以我想也許有可能只根據它們(名字,姓氏,家鄉)獲得兩者中不存在的條目。 有沒有一種特定的方法來返回MySQL中同時存在的兩個表中的唯一值(如果有所不同,則返回MySQLi)?

對於這方面的措辭,我道歉,我無法正確寫字。

反連接是一種熟悉的模式。

您已經知道如何查找具有匹配項的行:

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中的列,如果找到匹配,我們知道該列不是 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM