2012-06-21 88 views
1

我試圖在MySQL SELECT語句中包含子查詢來組裝產品鏈接,當與該鏈接關聯的產品ID可能不再存在時。當該產品ID不存在時,子查詢找不到任何結果,並且整個行從最終結果中被省略。無論如何,我希望該行能夠被返回(NULL值會很好)。當子查詢匹配沒有結果時,MySQL子查詢忽略整行

SELECT s.field_a, s.field_b, s.field_c, 
    (SELECT CONCAT('/', sma.name_link, '/', smo.name_link, '.html?pid=', spr.id) 
     FROM sales_products AS spr, sales_sections AS see, 
      sales_models AS smo, sales_manufacturers AS sma 
     WHERE sse.id = spr.sales_section_id AND smo.id = sse.sales_model_id 
      AND smo.sales_manufacturer_id = sma.id 
      AND spr.id = s.sales_product_id 
    ) AS product_link 
    FROM sales_order_items AS s, sales_products AS p 
    WHERE s.order_id = 100 AND p.id = s.sales_product_id 
    ORDER BY shipment_id, sales_order_item_id 

我已經搜索了很長一段時間,但我只是沒有設法將這一塊拼湊在一起。我期待着可以提供的任何形式的反饋或解決方案。

回答

0

我在您的查詢的任何位置沒有看到product_id列參考,因此我打算假定您的意思是它的sales_product_id列的值不匹配id值sales_product表。

我不認爲「缺失行」的問題與SELECT列表中的子查詢有關;我相信它與INNER JOIN到sales_product表有關。我建議你將它改爲左外連接。

SELECT s.field_a 
    , s.field_b 
    , s.field_c 
    , (SELECT CONCAT('/',sma.name_link,'/',smo.name_link,'.html?pid=',spr.id) 
      FROM sales_products spr 
      JOIN sales_sections see ON sse.id = spr.sales_section_id 
      JOIN sales_models smo ON smo.id = sse.sales_model_id 
      JOIN sales_manufacturers sma ON sma.id = smo.sales_manufacturer_id 
     WHERE spr.id = s.sales_product_id 
     ORDER BY 1 LIMIT 1 
     ) AS product_link 
    FROM sales_order_items s 
    LEFT 
    JOIN sales_products p ON p.id = s.sales_product_id 
WHERE s.order_id = 100 
ORDER BY shipment_id, sales_order_item_id 

注:在SELECT列表(別名爲product_link)子查詢的問題,是該語句將拋出一個異常,如果(何時?)子查詢返回不止一行。除非你有某種保證永遠不會這麼做,至少你可以在它上面打一個ORDER BY 1 LIMIT 1,或者在CONCAT周圍打一個MAX聚合(這樣它就是確定的)。

使用表別名限定ORDER BY子句中的列引用是防止潛在的「模糊列」異常的保護,這也是一個非常好的主意。我發現所有的列引用都是合格的,這是一件非常好的事情。

您可能還注意到我重新格式化了原始查詢,並且引入了JOIN關鍵字(代替逗號),並將連接謂詞從WHERE子句移到了ON子句中。我發現這使得語句更容易閱讀,並且更容易調試。它還讓你指定一個OUTER JOIN。

+0

謝謝你,斯賓塞。這完美地完成了這個技巧。看起來你明白我想要完成的事情(爲了簡化示例,我從查詢中刪除了很多內容)。 同時也感謝您與我分享更多的想法和最佳實踐。我真的很感激。 – James

+0

答覆完畢後,我點擊複選框接受答案。我想這就是你的建議?請讓我知道是否還有更多我錯過的東西。 – James

-1

您可能想要在查詢中嘗試使用UNION,或者如果值爲空,甚至可以使用IF sql條件來設置NULL。

希望有所幫助。

+0

謝謝你的建議。我無法將工作解決方案放在一起,但這可能是由於我相對缺乏經驗。 – James