我正在与一个处理产品的双语网站合作。
每个产品都有一个 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
会导致此行为。
有没有办法在不重复行的情况下检索相同的字段?
谢谢
最佳答案
当你有 WHERE 条件 products.slug='slug' 时,你真的需要阅读 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 ...
问题是,您首先创建这些关系的笛卡尔积,这会导致 以下 View :
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
现在,您对该笛卡尔积进行分组并计算总和。你必须知道,如果它是正确的, 一种产品有多种语言的描述。可能是错误的 您的应用程序的业务 View 。在这种情况下,您只需要“修复”数据库即可。
如果您的数据正确,则您需要单独对
产品
进行分组。类似于: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 ...
但是,同时使用 viki888 中的 sql,您将在同一 sku 的结果中得到 2 行,但是, 正确的总和为 7,并且有不同的描述。
我想知道,您的选择是否会运行,因为在分组时,您只能选择分组依据(加上剩余属性上的聚合函数)的属性。由于您按
sku
进行分组,因此在具有相同sku
值的 1 组中,您会获得多种产品。因此,即使您对每种产品只有一个描述(以一种语言),您也会尝试向一组产品附加一个描述,但是哪一个呢?这没有任何意义,而且 SQL 在执行时应该崩溃。
尝试总结一下您的目标是什么,并提供一些示例数据(products_locale
的内容、products
的内容以及您想要的结果)
关于php - MySQL:连接表重复 SUM(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40676093/