2014-05-06 67 views
1

我陷入查詢中。這是我目前的查詢。mysql多次連接並從兩個內部連接表中檢索到只有一條記錄

SELECT products.product_id, products.product_title, 
    package_category_products.PCP_id, 
    product_images.PI_file_name 
FROM package_category_products 
LEFT JOIN products ON products.product_id = package_category_products.PCP_product_id 

-- BEGIN MARKED CODE 
LEFT JOIN product_inventories on product_inventories.PI_product_id = products.product_id 
INNER JOIN product_images on product_images.PI_product_id = product_inventories.PI_product_id 
    AND product_images.PI_color = product_inventories.PI_color_id 
-- END MARKED CODE 

WHERE PCP_package_id = 17 
AND PCP_package_category_id = 3 
AND product_status ='active' 

該查詢返回當前的冗餘數據。我想在標記的代碼中使用子查詢,以便在加入後僅從這兩個表中返回一條記錄。所以我會避免重複的數據,並注意每個產品只需要一條記錄。

+0

你可以使用'GROUP BY products.product_id' – Ejaz

+0

三種情況之一,使用'distinct'因爲你沒有返回所有列其中唯一標識每個表的記錄。由於相同的原因,爲每個返回的列使用'group by'。或者你的一個聯接缺少一個導致意想不到的carteasean的聯接標準。表結構和示例數據顯示了每個表的問題......存在這三種可能性中的任何一種。我個人對於我來說似乎更清潔一些,因爲我必須對我的分組進行有意識的努力,這可能導致我發現一個不好的加入...... – xQbert

回答

1

取代 「選擇」 按 「SELECT DISTINCT」:

SELECT DISTINCT a.product_id, a.product_title, d.PCP_id, c.PI_file_name 

FROM package_category_products as d 
LEFT JOIN products as a 
ON a.product_id = d.PCP_product_id 

LEFT JOIN product_inventories as b on b.PI_product_id = a.product_id 

INNER JOIN product_images as c 
ON c.PI_product_id = b.PI_product_id AND c.PI_color = b.PI_color_id 

WHERE PCP_package_id = 17 AND PCP_package_category_id = 3 AND product_status ='active'