2017-04-10 775 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