0

次のクエリを使用してこれらのテーブルに関する情報を取得していますが、defenderhitおよびdefenderdamage SUM値は、最初の結合の行番号の行数で乗算されています。

テーブル'バトル':

battle_id   city_id     attacker    defender    battle_time 
1           07          6           0           1342918014

テーブル'バトルヒット':

battle_id   family_id   user_id     hits    damage 
1           0           0           1000    50000
1           6           15          108     3816
1           6           2           81  2046
1           6           1           852 1344

MySQLクエリ

SELECT b.battle_id, b.city_id, b.attacker, b.defender, b.battle_time,
SUM(COALESCE(bh1.damage,0)) AS attackerdamage, SUM(COALESCE(bh2.damage,0)) AS defenderdamage,
SUM(COALESCE(bh1.hits,0)) AS attackerhit, SUM(COALESCE(bh2.hits,0)) AS defenderhit
FROM battles AS b
LEFT JOIN battlehits AS bh1 ON b.attacker = bh1.family_id
LEFT JOIN battlehits AS bh2 ON b.defender = bh2.family_id
WHERE b.battle_id=1
GROUP BY b.battle_id LIMIT 1

このクエリの結果は次のとおりです。

battle_id   city_id     attacker    defender    battle_time     attackerdamage  defenderdamage  attackerhit     defenderhit 
1           07          6           0           1342918014      7206            150000          1041            3000

表のデータからわかるように、defenderhitとdefenderdamageのSUM値は1000と50000であると想定されていますが、これらは3倍されています。ここで何をしているのですか?どうしたの?

前もって感謝します。

4

2 に答える 2

1

を使用して、個別の行のSUMをエミュレートできます。

(SUM(t.field_to_sum) / COUNT(t.primary_key) * COUNT(DISTINCT t.primary_key))
于 2012-07-22T00:06:24.783 に答える
1

group by/sumの前に3つの行があります。バトルヒットからの3つの攻撃者の行ごとに1つの行があります。これらのそれぞれは、バトルヒットからの同じディフェンダー行とペアになり、ディフェンダーデータが3倍になります。これを確認するには、group by句とlimit句を削除し、sum()を取り出します。すべての防御側とすべての攻撃側の外積を効果的に作成し、合計します。

これは、防御側データが重複している3つの行を示しています。これは、1対1ではなく、1対多対多の関係で結合を行った結果です。

SELECT b.battle_id, b.city_id, b.attacker, b.defender, b.battle_time,
COALESCE(bh1.damage,0) AS attackerdamage, COALESCE(bh2.damage,0) AS defenderdamage,
COALESCE(bh1.hits,0) AS attackerhit, COALESCE(bh2.hits,0) AS defenderhit
FROM battles AS b
LEFT JOIN battlehits AS bh1 ON b.attacker = bh1.family_id
LEFT JOIN battlehits AS bh2 ON b.defender = bh2.family_id
WHERE b.battle_id=1;

出力:

battle_id   city_id attacker    defender    battle_time attackerdamage  defenderdamage  attackerhit defenderhit
1   7   6   0   1342918014  3816    50000   108 1000
1   7   6   0   1342918014  2046    50000   81  1000
1   7   6   0   1342918014  1344    50000   852 1000

これを個別のクエリに分割する必要があります。1つは攻撃者の合計用で、もう1つは防御側の合計用です。

于 2012-07-22T00:20:21.277 に答える