2009-06-09 48 views
1

非比賽我有兩個表如何從一個表中選擇基於另一個在MySQL的

項:ID,名稱

類別:items_id,類

,我需要選擇所有其ID不在CATEGORIES表中的項目。

我懷疑這很簡單,但無法弄清楚語法。

+0

你真的可以在類別表中有一個名爲「items.id」的列嗎? – 2009-06-09 20:15:00

+1

對不起,編輯它以反映現實:) – 2009-06-09 20:15:49

回答

3

NOT IN(選擇CATEGORIES.item_id)

不知道這是不是上面的join快...但它的工作原理。

+0

這就是我也會這樣做的,而且它簡單得多。 – 2009-06-09 20:18:36

+1

如果性能很重要...分析兩個版本。也就是說,我的第一個(也可能是唯一的)擺動就是NOT IN。 – Adrien 2009-06-09 20:22:06

+0

我更喜歡在NOT IN中使用LEFT JOIN,因爲在過去,我已經使用不使用索引的查詢進行了刻錄,並且普通連接通常會正確使用索引。我對mysql不太瞭解,知道哪個運行得更快,但是如果兩者都使用索引,他們將完全相同的執行計劃。 – 2009-06-09 20:26:42

0

這將選擇項目表中的所有內容,並僅選擇與連接相匹配的類別中的記錄。然後過濾出空值。

Select Item.Id 
FROM ITEMS LEFT OUTER JOIN CATEGORIES On 
Items.Id = Categories.items_id 
where categories.items_id is null 
+0

MySQL字段不區分大小寫。該代碼真的很sl so,所以我批准你的downvote。 – 2009-06-09 20:20:28

+0

+1,我喜歡通過NOT IN的左連接方法 – 2009-06-09 20:23:46

3

試試這個:

SELECT 
    i.* 
    FROM Items i 
     LEFT OUTER JOIN Categories c ON i.id=c.items_id 
     WHERE c.items_id is NULL 
0

如何

SELECT id 
, name 
FROM ITEMS 
WHERE NOT EXISTS(SELECT 1 FROM CATEGORIES WHERE Categories.items.id = ITEMS.id) 

這隻會帶回沒有在分類表中的至少一個輸入項

0
SELECT items.id 
    FROM items 
WHERE NOT EXISTS(SELECT * 
        FROM categories 
        WHERE items.id = categories.items.id) 

這是一樣的麥克加入到類別表Pone和KM列出,但我覺得這更可讀。

2
SELECT * FROM Items 
WHERE id NOT IN (SELECT items_id FROM Categories) 
相關問題