2016-02-09 58 views
-1

我在用的Prestashop一個SQL查詢的時刻遇到了一些問題,並沒有對如何刪除重複的想法導致重複左結果加入SQL數據庫

這是查詢:

SELECT DISTINCT ps_product.id_product 
     , ps_product_lang.name 
     , ps_category_lang.link_rewrite as categoryName 
     , ps_product_lang.description_short 
     , ps_product_lang.link_rewrite 
     , ps_product.condition 
     , available_now 
     , ps_product.price 
     , ps_product_lang.id_lang 
FROM ps_product 
LEFT JOIN ps_product_lang ON ps_product.id_product = ps_product_lang.id_product 
LEFT JOIN ps_category_lang ON ps_product.id_category_default = ps_category_lang.id_category 
WHERE ps_product_lang.id_lang = 1; 

的問題是,我得到重複行,我只根據語言需要每個ID 一行,這是我得到的結果:

https://drive.google.com/file/d/0B_Wyxd-54fbsbjBwMHJFbEpRVHc/view?usp=sharing

+3

向我們展示一些數據,當前和預期結果。請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是[** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) –

+0

請提供架構,實際和預期結果,以便我們能夠理解您的查詢更好。 –

+0

這是因爲對於同一產品,一個或兩個連接表可能有多行。嘗試通過使用'where'子句縮小查詢範圍,可能是您想要產品的語言。 –

回答

0

無論您使用何種語言,您都在爲類別選擇所有類別名稱。所以你得到't恤'加't恤'和'上衣'加'化學家'。將AND ps_category_lang.id_lang = 1添加到您的查詢中,以便僅獲取該語言的類別名稱。

您也在這裏使用外部連接,以便獲得缺少語言條目的產品。但是在外連接記錄ps_product_lang.id_lang中將爲空。您的WHERE子句WHERE ps_product_lang.id_lang = 1將失敗並丟棄每個外連接記錄,並且您將擁有一個簡單的INNER JOIN。在ON子句中對外連接表有條件。

SELECT 
    p.id_product 
    , p.name 
    , cl.link_rewrite as categoryName 
    , pl.description_short 
    , pl.link_rewrite 
    , p.condition 
    , p.available_now 
    , p.price 
    , pl.id_lang 
FROM ps_product p 
LEFT JOIN ps_product_lang pl ON p.id_product = pl.id_product and pl.id_lang = 1 
LEFT JOIN ps_category_lang cl ON p.id_category_default = cl.id_category and cl.id_lang = 1;