0

みなさん、おはよう/こんばんは

2 つのテーブルを 1 つのテーブルと一致するステートメントSUM()の特定の列の値に (LEFT) JOIN しようとしています。ON fk_id = id...テーブルは次のようになります。

ws1 テーブル:

ws1 テーブル

ws2 テーブル:

ws2 テーブル

これまでに試したクエリ:

SELECT
    alias.name alias,   
    (SUM(IFNULL(ws1.teamkills,0)) + SUM(IFNULL(ws2.teamkills,0))) teamkills
FROM pickup
    JOIN player ON player.pickup_id = pickup.id
    JOIN alias ON player.alias_id = alias.id
    LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
    LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id

結果:

クエリ結果

と:

SELECT
    alias.name alias,   
    (SUM(DISTINCT IFNULL(ws1.teamkills,0)) + SUM(DISTINCT IFNULL(ws2.teamkills,0))) teamkills
FROM pickup
    JOIN player ON player.pickup_id = pickup.id
    JOIN alias ON player.alias_id = alias.id
    LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
    LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id

結果:

クエリ結果

同じ値の結果を 1 つだけ選択するため、 がSUM(DISTINCT.... )返されることを理解しています。2DISTINCT

私の目標はSUM()、両方のteamkillsフィールドを取得して、それらを合計することです。3この例では、 where player_idisを返す必要があり4ます。どうやってやるの?

編集:

テーブル「プレーヤー」:

ここに画像の説明を入力

テーブル「ピックアップ」:

ここに画像の説明を入力

4

3 に答える 3

2

ws1+ws2 の結合の代わりに 2 つの従属サブクエリが必要です。ここでは jonin は機能しません。
何かのようなもの:

SELECT id, player_alias,
       ( SELECT sum( teamkills ) FROM ws1
         WHERE ws1.player_id = player.id )
        +
       ( SELECT sum( teamkills ) FROM ws2
         WHERE ws2.player_id = player.id ) as total
FROM player
JOIN alias ON ......

これが ですSQLFiddle demo。最初のクエリ (および下の結果セット) を見て、なぜ結合から間違った結果が得られるのか、一般的に結合がどのように機能するのかをよりよく理解してください。

Join は、あるテーブルの各レコードを他のテーブルの対応するすべてのレコード (結合基準を満たす) に結合 (接着) します。この場合、データが重複する 4 つの行が生成されます。

このデモの 3 番目のクエリは、適切な結果を返す従属サブクエリの例です (このデモのデータなど)。

于 2013-07-27T04:59:48.273 に答える
0

相関サブクエリを使用しない場合の解決策

SELECT a.name alias, SUM(q.teamkills) teamkills
  FROM
(
  SELECT player_id, teamkills
    FROM weapon_stats_1 w JOIN pickup p
      ON w.pickup_id = p.id
   WHERE p.logfile_name = 'srv-20130725-2151-log'
   UNION ALL
  SELECT player_id, teamkills
    FROM weapon_stats_2 w JOIN pickup p
      ON w.pickup_id = p.id
   WHERE p.logfile_name = 'srv-20130725-2151-log'
) q JOIN player p
    ON q.player_id = p.id JOIN alias a
    ON p.alias_id = a.id
 GROUP BY a.name

出力例:

| | エイリアス | チームキル |
----------------------
| | エイリアス4 | 3 |

これがSQLFiddleのデモです

于 2013-07-27T05:15:32.373 に答える