MySQL:加入表重复SUM()
我正在处理产品的双语网站。MySQL:加入表重复SUM()
每个产品有一个sku
和supplier_id
。当插入产品时,如果sku
和supplier_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_locale
和app_categories_locale
,但只有products_locale
会导致此行为。
有没有任何方法检索相同的领域没有重复的行?
谢谢
试试下面的查询
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')
希望这应该解决您的问题。
我很抱歉,但这个查询有什么问题抛出一些错误的语法 –
? – Viki888
你真的需要阅读products.slug,当你有WHERE条件products.slug = '塞'?我的意思是,无论如何,你只能得到值'slug'的行。
-
您的产品表可能看起来像
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,并用不同的描述。
我不知道,如果你的选择甚至可以运行,因为分组的时候,你只能选择属性,你被(再加上其余的属性聚合函数)分组。因为由
sku
你组,1组相同sku
价值,你会得到几种产品。因此,即使你只有一个(在1种语言)每个产品的描述,您试图附加到产品的一个描述组,但哪一个?它没有任何意义,并且SQL在执行时应该会崩溃。
试着总结一下,什么是你做的目的,并给予一定的样本数据(的products
的products_locale
内容,内容和你想要的结果)
这真的很难,没有任何其他的数据说。尝试选择*并删除组。这应该显示所有行和一些列是重复行。一旦你确定这些,它会很容易更新查询 –
你想知道什么?删除组不会改变任何内容,选择*也不会改变任何内容。正如我所说的,是单LEFT JOIN的问题 –