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

标签 php mysql join sum left-join

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

每个产品都有一个 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/

相关文章:

php - Stripe 签账卡使用 php Rest api 时出现 fatal error

php - 在 PHP 中使用 === 而不是 == 的重要性!

php - 可以在 PHP 中使用 Activex 吗?

python - 如何使用 MySQL 使用经度和纬度列找到行之间的距离?

php - 如何对内部联接进行联接?

php - 字符串表示之外的复杂( curl )语法的目的

mysql - 数据库中是否有用于版本控制的通用选项?

mysql - 通过带有联接或分组依据的 SQL 请求返​​回过去

mysql - CodeIgniter 从两个以上的表中获取记录

r - 数据表按组滚动连接