2016-11-18 90 views
0

我正在處理產品的雙語網站。MySQL:加入表重複SUM()

每個產品有一個skusupplier_id。當插入產品時,如果skusupplier_id已經存在,而不是創建新產品,我只需更新其數量。

如果只有sku匹配,但supplier_id是不同的,那麼我創建一個新產品。

由於該網站是多語言,因此有一些翻譯表。

當我搜索產品時,我會每個顯示一個sku,對數量進行求和。

這是我的查詢

SELECT 
    products.id, products.sku, products.slug, 
    SUM(products.quantity) quantity, 
    suppliers.name supplier_name, 
    locale.description, 
    categories.name category_name 
FROM products products 
    LEFT JOIN products_locale locale ON (products.id = locale.product_id AND locale.language_code = 'it') 
    LEFT JOIN app_suppliers suppliers ON products.supplier_id = suppliers.id 
    LEFT JOIN app_categories_locale categories ON (products.category_id = categories.category_id AND categories.language_code = 'it') 
WHERE products.slug = 'slug' 
GROUP BY products.sku 

有2級不同的產品具有相同sku,一個擁有量5和其他有2

quantity場應返回7,而是返回9基本上,第二個產品是重複的。

刪除LEFT JOIN products_locale locale ON (products.id = locale.product_id AND locale.language_code = 'it')可解決問題,但我需要該字段。

更奇怪的是,我加入了兩個翻譯表,products_localeapp_categories_locale,但只有products_locale會導致此行爲。

有沒有任何方法檢索相同的領域沒有重複的行?

謝謝

+0

這真的很難,沒有任何其他的數據說。嘗試選擇*並刪除組。這應該顯示所有行和一些列是重複行。一旦你確定這些,它會很容易更新查詢 –

+0

你想知道什麼?刪除組不會改變任何內容,選擇*也不會改變任何內容。正如我所說的,是單LEFT JOIN的問題 –

回答

0

試試下面的查詢

SELECT P.*, locale.description 
FROM ( 
    SELECT 
     products.id, products.sku, products.slug, 
     SUM(products.quantity) quantity, 
     suppliers.name supplier_name, 
     categories.name category_name 
    FROM products products 
     LEFT JOIN app_suppliers suppliers ON products.supplier_id = suppliers.id 
     LEFT JOIN app_categories_locale categories ON (products.category_id = categories.category_id AND categories.language_code = 'it') 
    WHERE products.slug = 'slug' 
    GROUP BY products.sku) P   
    LEFT JOIN products_locale locale ON (P.id = locale.product_id AND locale.language_code = 'it') 

希望這應該解決您的問題。

+0

我很抱歉,但這個查詢有什麼問題拋出一些錯誤的語法 –

+0

? – Viki888

1
  1. 你真的需要閱讀products.slug,當你有WHERE條件products.slug = '塞'?我的意思是,無論如何,你只能得到值'slug'的行。

  2. 您的產品表可能看起來像

    ID | quantity | products.sku | ... 
    ---------------------------------- 
    1 | 5  |  sku1 
    2 | 2  |  sku1 
    ... 
    

    和products_locale可能看起來像

    product_id | description | language_code | ... 
    ------------------------------------- 
        1  | abc  |  it 
        2  | def  |  it 
        2  | xyz  |  it 
    ... 
    

    的問題是,你首先要創建這些關係的笛卡爾積,其結果 以下查看:

    ID | quantity | products.sku | product_id | description | language_code | ... 
    ----------------------------------------------------------- 
    1 | 5  |  sku1  |  1  | abc  |  it 
    2 | 2  |  sku1  |  2  | def  |  it 
    2 | 2  |  sku1  |  2  | xyz  |  it 
    

    Now y你分組這個笛卡爾積並計算總和。你必須知道,如果它是正確的, 一種產品有一種以上語言的描述。這可能是從您的應用程序的業務視圖 錯誤。在這種情況下,你只需要「修復」你的數據庫。

    如果您的數據是正確的,那麼你需要單獨組products。喜歡的東西:

    SELECT * FROM 
        (SELECT id, sku, SUM(quantity) from products WHERE slug='slug' group by sku, id) p 
        LEFT JOIN products_locale l ON p.id=l.product_id  
        LEFT JOIN ... 
        LEFT JOIN ... 
    

    但後來,也使用SQL從viki888,你將得到2列在同一個SKU的結果,然而,隨着 正確和7,並用不同的描述。

  3. 我不知道,如果你的選擇甚至可以運行,因爲分組的時候,你只能選擇屬性,你被(再加上其餘的屬性聚合函數)分組。因爲由sku你組,1組相同sku價值,你會得到幾種產品。因此,即使你只有一個(在1種語言)每個產品的描述,您試圖附加到產品的一個描述組,但哪一個?它沒有任何意義,並且SQL在執行時應該會崩潰。

試着總結一下,什麼是你做的目的,並給予一定的樣本數據(的productsproducts_locale內容,內容和你想要的結果)