2011-11-16 143 views
8

我有一個MySQL數據庫2個表:MySQL的一個表中選擇字段不在另一個表

Table 1 : id, galleryname 
Table 2 : galleryid, <many other fields...> 

使用PHP,我需要根據其ID,其中該ID來選擇表1中的所有行(galleryid)未出現在表2中

實施例: 表1

1, flowers 
2, water 
3, mountains 
4, winter 

表2

3, ... 

會從表1

1, flowers 
2, water 
4, winter 

返回這些行,我不完全知道如何去這個問題。我非常擅長MySQL的基礎知識,但我懷疑這是一個JOIN或一個UNION,它不在我的聯盟中。

任何幫助表示讚賞。

回答

19

試試這個:

SELECT * FROM table1 
WHERE id NOT IN 
    (SELECT galleryid FROM table2) 

SELECT * FROM table1 
LEFT JOIN table2 
    ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
+0

很確定你必須在'()'中包裝你的子選擇才能使你的'IN'語句正常工作。 –

+1

@AdamWenger:是的,我確定我必須...只是我忘了!感謝您的建議! :) – Marco

7

LEFT JOIN把所有的T1記錄,然後過濾掉那些t2.galleryid NULL(T2中沒有記錄)

SELECT id, galleryname 
FROM table1 AS t1 
LEFT OUTER JOIN table2 AS t2 ON t1.id = t2.galleryid 
WHERE t2.galleryid IS NULL 
+0

很乾淨的查詢與非常明確的評論發生了什麼事情。對我來說,這是正確的答案,也是解決手頭問題的最好方法,因爲在大型表上使用子選擇並不是一個好主意 – Shmarkus

2
SELECT * FROM table1 
LEFT JOIN table2 
ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
1

有人發佈了一個答案(然後刪除它只給了我兩個記錄。這裏的所有其他人似乎給出了錯誤,但使用原來的帖子,我做了一個改變,它的工作。

原文:

SELECT * FROM table1 INNER JOIN table2 ON galleries.id = images.galleryid 

(這給了我夢想中的那兩個)

添加:

SELECT * FROM table1 INNER JOIN table2 ON galleries.id != images.galleryid 

(這給了我,我需要的東西)

+0

使用!=的內部連接是非常糟糕的做法。首先創建兩個表的笛卡爾乘積,然後過濾掉匹配的行。隨着每個表中的行數增加,這變得非常低效。 –

相關問題