2017-04-10 96 views
0

考虑以下查询groupping: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 

我试图理解上的差异是什么(如果有的话)groupping之间通过table1.idtable2.id groupping。总之,当内部连接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行为的相关信息,因此有关澄清此问题的任何帮助将非常感谢。

回答

1
  1. inner join的结果将是一个集相匹配的事务ID行的,所以组值列可以将两个transaction相同和transaction_product表。

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

结果:不会有你有两个选择之间的任何差别,因为相同的行会具有完全相同的标准进行分组,属于该组数值的两侧是相同的。

TL/DR

有根本没有区别。

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