2017-04-10 17 views
0

によってgroupping:(もしあれば)私はtable1.idによってgrouppingとtable2.idによって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 

を。一言で言えば、2つのテーブルをX=Yに接続すると、Xでグルーピングし、Yでグルーピングしたときの違いは何ですか?それでおしまい。


現実世界の例 - 非常に簡単:テーブルtransactionは、トランザクション情報(支払った金額、日付など)、およびテーブルを保持しているtransaction_productは、製品がどのトランザクションに含まれていたかに関する情報を保持しています。

たとえば、トランザクション番号1に商品番号1,2および3などが含まれている可能性があります(テーブル関係は明らかに1対多です)。

問題:私はトランザクションごとにどれだけ多くの商品が支払われたかを知る必要があります。私は選択肢BY 2 GROUPの間に差があるかどうかを知る必要があり

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の動作に関する関連情報を見つけることができませんでした。したがって、問題を明確にするための助けがあれば大いに感謝します。

答えて

1
  1. inner joinの結果が一致するトランザクションIDを持つ行のセットとなりますので、列を持つことができる値のセットが両方transactionに同じになりますテーブルはtransaction_productです。

  2. group byは、グループ化された列の使用可能な値ごとに1行を返します。同じ値を共有するすべての行は、使用する集計関数で集計されます。結果

結果:同じ行が値の集合両側で同じであること、まったく同じ基準でグループ化されますので、あなたが持っている2つのオプションのいずれかの違いがありません。

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