9

私はこれに対する解決策を探していました。同様の質問がたくさんありますが、問題を解決するのに役立つ適切な回答はありません。

まず、私の質問/問題:

  1. 複数の結合クエリで特定の列を合計してカウントしたい
  2. 複数の結合では不可能ですか? SELECTクエリをネストする必要がありますか?

サンプル データを含む私のデータベースの SQL ダンプは次のとおりです

これは私がトリックを行うと思ったクエリです:

SELECT firstname, lastname, sum(goal.goal), sum(assist.assist), sum(gw.gw), sum(win.win), count(played.idplayer) FROM player
LEFT JOIN goal USING (idplayer)
LEFT JOIN assist USING (idplayer)
LEFT JOIN gw USING (idplayer)
LEFT JOIN win USING (idplayer)
LEFT JOIN played USING (idplayer)
GROUP BY idplayer

これを作成したいのは、次のように、ゴール、アシスト、gw、勝利、およびプレイの列がその列のすべての行の合計/カウントであるテーブルです: (提供されたサンプル データを使用)

+-----------+----------+------+--------+----+-----+--------+
| firstname | lastname | goal | assist | gw | win | played |
+-----------+----------+------+--------+----+-----+--------+
| Gandalf   | The White|   10 |      6 |  1 |   1 |      2 |
| Frodo     | Baggins  |   16 |      2 |  1 |   2 |      2 |
| Bilbo     | Baggins  |    7 |      3 |  0 |   0 |      2 |
+-----------+----------+------+--------+----+-----+--------+

上記の質問をもう一度繰り返しますが、これは 1 つのクエリと複数の結合で可能ですか?

解決策/クエリを提供する場合は、それらを説明してください! 私は適切なリレーショナル データベースを初めて使用し、このプロジェクトの前に結合を使用したことがありません。また、必要な場合を除き、エイリアスを避けていただければ幸いです。

合計とグループ化を行わずに上記のクエリを実行すると、実行する列ごとに一連の行が得られますSELECT。これは、乗算または加算されると思われますが、グループ化および/または実行sum(TABLE.COLUMN)するとそれが解決されるという印象を受けました.

SELECT DISTINCTもう1つのことは、または他のDISTINCT操作を実行すると、一部の(「重複」)結果が除外されるため、機能しないと思います。

PS。問題があれば、私の開発マシンは WAMP ですが、リリースは ubuntu/apache/mysql/php になります。

4

1 に答える 1

12

期待した答えが得られない理由を理解するには、次のクエリを見てください。

SELECT * FROM player LEFT JOIN goal USING (idplayer)

ご覧のとおり、左側の行は右側の一致する行に複製されています。この手順は、結合ごとに繰り返されます。クエリの生データは次のとおりです。

SELECT * FROM player
LEFT JOIN goal USING (idplayer)
LEFT JOIN assist USING (idplayer)
LEFT JOIN gw USING (idplayer)
LEFT JOIN win USING (idplayer)
LEFT JOIN played USING (idplayer)

これらの繰り返される値は、SUM 計算に使用されます。行を結合する前に、SUM を計算する必要があります。

SELECT firstname, lastname, goals, assists, gws, wins, games_played
FROM player
INNER JOIN 
  (SELECT idplayer, SUM(goal) AS goals FROM goal GROUP BY idplayer) a
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, SUM(assist) AS assists FROM assist GROUP BY idplayer) b
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, SUM(gw) AS gws FROM gw GROUP BY idplayer) c
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, SUM(win) AS wins FROM win GROUP BY idplayer) d
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, COUNT(*) AS games_played FROM played GROUP BY idplayer) e
  USING (idplayer)

SQLフィドル

于 2013-01-02T01:54:10.037 に答える