【问题标题】:MySQL GROUP BY and INNER JOIN - groupping by the joined fieldsMySQL GROUP BY 和 INNER JOIN - 按连接字段分组
【发布时间】:2017-04-10 13:03:56
【问题描述】:

考虑以下查询:

SELECT COUNT(table1.someField), COUNT(table2.someField)
FROM table1 
INNER JOIN table2 ON table2.id = table1.id
GROUP BY table1.id

我试图了解table1.id 分组和table2.id 分组之间的区别(如果有的话)。简而言之,当在X=Y 上内联两个表时,按X 分组和按Y 分组时有什么区别。就是这样。


现实世界的例子 - 非常简单:transaction 表保存交易信息(支付金额、日期等),transaction_product 表保存有关哪些产品包含在哪些交易中的信息.

因此,例如,事务编号 1 可能包含产品编号 1、2 和 3,依此类推(因此表关系显然是一对多的)。

问题:我需要知道每笔交易,多少产品支付了多少。这是查询,包括两个 GROUP BY 选项:

SELECT 
    `transaction`.id,
    SUM(`transaction`.transaction_amount) AS total_amount, 
    COUNT(`transaction_product`.product_id) AS number_of_products
FROM `transaction`
INNER JOIN `transaction_product` ON `transaction_product`.transaction_id = `transaction`.id
GROUP BY [`transaction`.id [OR] `transaction_product`.transaction_id]

我需要知道这两个 GROUP BY 选项之间是否存在差异。在这种情况下,我在文档中找不到有关 GROUP BY 行为的相关信息,因此非常感谢任何有关澄清此事的帮助。

【问题讨论】:

    标签: mysql group-by inner-join


    【解决方案1】:
    1. inner join 的结果将是一组具有匹配事务 ID 的行,因此该列可以具有的一组值在 transactiontransaction_product 表上将是相同的。

    2. group by 将为分组列的每个可用值返回一行,并且共享相同值的所有行将使用您使用的聚合函数进行聚合。结果

    结果:您拥有的两个选项之间不会有任何区别,因为相同的行将按照完全相同的条件进行分组,即两边的值集相同。

    TL/DR

    完全没有区别。

    【讨论】:

      【解决方案2】:

      无论您选择在 GROUP BY 子句中包含哪个 id,都没有区别。每个事务 id 的总行数将是该事务的产品数。这个查询应该得到你需要的:

      SELECT 
          `transaction`.id,
          SUM(`transaction`.transaction_amount) AS total_amount, 
          COUNT(1) AS number_of_products
      FROM `transaction`
      INNER JOIN `transaction_product` ON `transaction_product`.transaction_id = 
      `transaction`.id
      GROUP BY `transaction`.id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        相关资源
        最近更新 更多