MySQL GROUP BY和INNER JOIN - 由连接字段填充

时间:2017-04-10 13:03:56

标签: 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的填充时有什么区别。就是这样。

真实世界的例子 - 非常简单:表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行为的相关信息,因此非常感谢任何有关澄清此事的帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  1. inner join的结果将是一组具有匹配事务ID的行,因此列可以具有的值集在transaction和{{1}上都是相同的表格。

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

  3. 结果:您所拥有的两个选项之间没有任何区别,因为相同的行将按照完全相同的标准进行分组,即两侧的值集合相同。

    <强> TL / DR

    完全没有区别。