2013-03-20 122 views
0

我試圖從order_product獲取product_description和描述中的所有內容。MYSQL查詢問題和子查詢

事情是,當我沒有結果order_product我只是沒有得到任何結果。 (即使在product_description中有東西)

我可能需要一個子查詢,但我無法弄清楚如何去做。

任何想法,將不勝感激

SELECT * 
FROM 
    " . DB_PREFIX . "product_description 
    INNER JOIN " . DB_PREFIX . "order_product ON (" . DB_PREFIX . "product_description.product_id = " . DB_PREFIX . "order_product.product_id) 
WHERE 
    order_id = '" . (int)$order_id . "' 
AND " . DB_PREFIX . "product_description.language_id = 2") 
+1

如果你想從左表中得到所有的結果,使用left join。 – 2013-03-20 14:43:51

回答

1

這是因爲如何INNER JOIN作品。內部聯接將表A中的每一行與表B中的每一行進行比較,並僅返回符合過濾條件的行。

如果您在order_product中沒有任何行,那麼您的匹配將失敗,並且內部連接將不會返回任何內容。

你想要的是OUTER JOIN。具體來說,你想有一個LEFT JOIN

試試這個:

SELECT * 
FROM 
    " . DB_PREFIX . "product_description 
    LEFT JOIN " . DB_PREFIX . "order_product ON (" . DB_PREFIX . "product_description.product_id = " . DB_PREFIX . "order_product.product_id) 
WHERE 
    order_id = '" . (int)$order_id . "' 
AND " . DB_PREFIX . "product_description.language_id = 2") 

什麼現在發生的是,你會得到PRODUCT_DESCRIPTION匹配的order_id = $ ORDER_ID所有行。如果order_product中沒有與product_id匹配的行,那麼來自order_product的字段將是NULL

另外,我會使用別名來清理您的查詢。您可以使用AS創建快捷方式名稱的表,你應該只選擇你真正想要的列(如你在你的描述說

SELECT pd.*, op.description 
FROM " . DB_PREFIX . "product_description AS pd 
    LEFT JOIN " . DB_PREFIX . "order_product as op 
    ON (pd.product_id = op.product_id) 
WHERE 
    pd.order_id = '" . (int)$order_id . "' 
    AND pd.language_id = 2 

此外,要非常小心插變量分爲查詢,如你是$ order_id。如果這是用戶提交的數據,你可能會遇到一些不愉快的意外。我不知道你在用什麼語言或API。