gpt4 book ai didi

php - MySQL:连接表重复 SUM()

转载 作者:行者123 更新时间:2023-11-29 11:10:25 25 4
gpt4 key购买 nike

我正在与一个处理产品的双语网站合作。

每个产品都有一个 skusupplier_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_localeapp_categories_locale,但只有 products_locale 会导致此行为。

有没有办法在不重复行的情况下检索相同的字段?

谢谢

最佳答案

  1. 当你有 WHERE 条件 products.slug='slug' 时,你真的需要阅读 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
    ...

    问题是,您首先创建这些关系的笛卡尔积,这会导致以下 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,并且有不同的描述。

  3. 我想知道,您的选择是否会运行,因为在分组时,您只能选择分组依据(加上剩余属性上的聚合函数)的属性。由于您按 sku 进行分组,因此在具有相同 sku 值的 1 组中,您会获得多种产品。因此,即使您对每种产品只有一个描述(以一种语言),您也会尝试向一组产品附加一个描述,但是哪一个呢?这没有任何意义,而且 SQL 在执行时应该崩溃。

尝试总结一下您的目标是什么,并提供一些示例数据(products_locale 的内容、products 的内容以及您想要的结果)

关于php - MySQL:连接表重复 SUM(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40676093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com