MySQL分组依据和内部联接-按联接字段分组

MySQL分组依据和内部联接-按联接字段分组,mysql,group-by,inner-join,Mysql,Group By,Inner Join,考虑以下问题: 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分组的区别是什么。就这样 现实世界的例子非常简单:一个表交易保存交易信息(支付

考虑以下问题:

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
分组的区别是什么。就这样


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

例如,事务编号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 behavior的相关信息,因此,如果您能帮助澄清此事,我将不胜感激。

无论您选择在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

无论您选择在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
  • 内部联接的结果将是一组具有匹配事务ID的行,因此列可以具有的值集在
    事务
    事务产品
    表上都是相同的

  • 分组依据
    将为分组列的每个可用值返回一行,所有共享相同值的行将使用您使用的聚合函数进行聚合。结果

  • 结果:您拥有的两个选项之间不会有任何差异,因为相同的行将使用完全相同的标准分组,这是两侧相同的值集

    TL/DR

    根本没有区别

  • 内部联接的结果将是一组具有匹配事务ID的行,因此列可以具有的值集在
    事务
    事务产品
    表上都是相同的

  • 分组依据
    将为分组列的每个可用值返回一行,所有共享相同值的行将使用您使用的聚合函数进行聚合。结果

  • 结果:您拥有的两个选项之间不会有任何差异,因为相同的行将使用完全相同的标准分组,这是两侧相同的值集

    TL/DR

    根本没有区别