2013-05-10 38 views
1

我有一個非常複雜的查詢。我所擁有的是帶有汽車零件(parts_list,大約600行)的表格,其中包含關於零件的一些信息,如名稱以及是否依賴於電機。對於運動依賴我有兩個不同的查詢,所以這是沒有電機依賴的(0,我將它另存爲布爾值)。大部分零件都可以拆卸並分解成更多零件,這就是爲什麼我將零件保存爲樹的原因,並且在該查詢中,我只拿取了無法拆卸的零件(樹葉)。該表僅表示可能部分的列表。現在,對於每個車型,我在另一個表格(零件)中保存一行,然後將parts_list_id和model_id粘貼在一起,然後將價格和數量粘貼在一起。現在,如果我運行查詢,它將成功地在表「parts」中生成大約500行(僅包含葉子部分),並且它將執行我所需的操作。模型ID約500(葉)部分。但有時候我會爲特定部分的另一個模型生成一行。然後查詢不會剩餘499行。它只適用於WHERE NOT EXISTS選擇查詢返回0的情況。如果即使存在一行,也不會插入其餘的。但它對我來說沒有意義,因爲它不應該像循環一樣檢查不同的值嗎?MySQL插入不存在的查詢將不會插入,如果即使只有一行

INSERT INTO parts (parts_list_id, model_id, motor_id) 
SELECT  orig1.id, '" . $this->model_id . "', '0' 
FROM  parts_list AS orig1 
LEFT JOIN parts_list AS orig2 ON (orig1.id = orig2.parent_id) 
WHERE  orig2.id IS NULL 
AND   orig1.motor_dependent = '0' 
AND NOT EXISTS (
    SELECT  t1.id 
    FROM  parts_list AS t1 
    LEFT JOIN parts_list AS t2 ON (t1.id = t2.parent_id) 
    LEFT JOIN parts ON (parts.parts_list_id = t1.id) 
    WHERE  t2.id IS NULL 
    AND   t1.motor_dependent = '0' 
    AND   parts.parts_list_id = t1.id 
    AND   parts.model_id = :model_id 
) 

回答

0

那麼,sql語句似乎很好。如果有一行,NOT EXISTS將返回false。這是正確的。沒有插入任何一行。也許你想使用parts_list_id NOT IN(你的子查詢)而不是NOT EXISTS進行一些不同的檢查。

NOT EXISTS表示整個集合的條件,NOT IN用於確定集合是否具有正確的項目。

我希望能把它弄清楚。僅僅從一個陳述來理解你的域名就有點困難。

+0

謝謝,我不知道NOT EXIST對於所有行都是全局的。我設法通過鎖定兩個id來處理它 - 來自WHERE NOT EXISTS子句中的子查詢和SELECT查詢中的子查詢。但無論如何我沒有使用正確的關鍵字。不是什麼應該使用。 – Tony 2013-05-10 16:13:39

+0

歡迎您有愉快的一天 – gpicchiarelli 2013-05-11 17:41:33