MySQL:加入表重复SUM()

问题描述:

我正在处理产品的双语网站。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的问题 –

试试下面的查询

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. 你真的需要阅读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内容,内容和你想要的结果)