2012-08-14 105 views
1

我正在建立一個PHP網頁界面的小書店的數據庫。對於這個問題,我想顯示'產品'表(prod_core)中的所有記錄,而沒有在'銷售'表(inc_core)中的產品字段'條形碼'中的'描述'字段中有值的記錄。正確使用SELECT WHERE NOT IN

我實際上設法爲第一個「銷售」突變獲得了這個工作,但是每當我向「銷售」表添加第二條記錄時,查詢就不再工作。 (除了添加的第一條記錄)。這是我的SQL代碼:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, 
     prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE prod_core.barcode NOT IN (
     SELECT `description` 
     FROM inc_core 
     GROUP BY prod_core.prodID)

我想它是與SQL不循環(即停止對該表查找符合要求的記錄),但我不知道。我非常感謝任何幫助!

+0

這看起來應該不解析。 「說明」不在組列表中。 – 2012-08-14 22:58:28

+0

@WalterMitty。 。 。這是mysql的一個「特性」。在google上查找「mysql hidden columns」。 – 2012-08-14 23:02:13

回答

3

我建議的LEFT JOIN代替NOT IN

SELECT 
    prod_core.prodID, 
    prod_core.title, 
    prod_core.location, 
    prod_core.genre, 
    prod_core.price, 
    prod_core.barcode 
FROM 
    prod_core 
    LEFT JOIN inc_core ON inc_core.`description` = prod_core.barcode 
WHERE 
    inc_core.`description` IS NULL 

而且,由於沒有在你的SELECT語句中的列都聚集功能的一部分,我刪除了GROUP BY DISTINCT取而代之。 ..但是,我不明白爲什麼這張表應該包含重複項。

編輯:我誤讀你的查詢,雖然group by是在外部查詢,而不是在子查詢... +1的其他答案,抓住了這一點。

+0

非常感謝Michael Fredrickson!你在一分鐘內就設法解決了我的小問題,整個一天我都在這個問題上背棄了自己......這個網站真棒。再次感謝! – 2012-08-14 23:01:43

+0

@GeoffreyBergman不客氣,很高興它的工作;如果這回答了你的問題,[請將其標記爲接受的答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – 2012-08-14 23:07:34

+0

剛剛做到了!必須等待8分鐘。 – 2012-08-14 23:10:05

1

我不認爲你by子句所需要的羣體,所以你應該能夠使用:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core) 
2

與您查詢的問題是,該集團由一個場,但你選擇另一個。這意味着你的子查詢爲每個產品選擇一個任意描述。無法保證您獲得您期望的完整列表。

解決這個問題的最簡單的方式是通過除去基團:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, 
     prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core) 

然而,這很可能是低效的。對於帶有子查詢的「in」,最好的優化是使用exists。另外,請確保描述中存在索引。這裏是一個替代版本,專爲MySQL:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, 
     prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE not exists (select 1 from inc_core where inc_core.description = prod_core.barcode) 

就個人而言,我不是相關子查詢作爲「中的」更換的大風扇。但是,這是mysql最優化的方法。