1

現在、私のクエリは次のようになります。

SELECT alias.name killer,
       SUM(kill_stats.amount) amount
FROM kill_stats
        JOIN pickup ON pickup.logfile = 'CTFCL-20130813-1456-shutdown2'
        JOIN account ON account.steam_id = '0:1:705272'
        JOIN player victim ON victim.pickup_id = pickup.id AND victim.account_id = account.id
        JOIN player killer ON killer.pickup_id = pickup.id AND kill_stats.killer_id = killer.id
        JOIN alias ON killer.alias_id = alias.id
WHERE kill_stats.victim_id = victim.id AND NOT killer.team_id = victim.team_id
GROUP BY kill_stats.killer_id
ORDER BY amount DESC

kill_statsテーブル レイアウト:

CREATE TABLE `kill_stats` (
  `killer_id` int(11) UNSIGNED NOT NULL,
  `victim_id` int(11) UNSIGNED NOT NULL,
  `weapon_id` int(11) UNSIGNED NOT NULL,
  `conced` bit(1) NOT NULL,
  `fc` bit(1) NOT NULL,
  `amount` int(11) UNSIGNED NOT NULL,
  PRIMARY KEY(`killer_id`, `victim_id`, `weapon_id`, `conced`, `fc`),
  CONSTRAINT `Ref_Killer` FOREIGN KEY (`killer_id`)
    REFERENCES `player`(`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `Ref_Victim` FOREIGN KEY (`victim_id`)
    REFERENCES `player`(`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `Ref_Weapon` FOREIGN KEY (`weapon_id`)
    REFERENCES `weapon`(`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
)
ENGINE=INNODB
CHARACTER SET utf8 
COLLATE utf8_unicode_ci ;

外部キーをダミーデータに置き換えた、より読みやすいビューを次に示します。

+-----------+-----------+-----------+--------+----+--------+
| killer_id | victim_id | weapon_id | conced | fc | amount |
+-----------+-----------+-----------+--------+----+--------+
| Josephine |   Frank   |    RPG    |   NO   | NO |   14   |
+-----------+-----------+-----------+--------+----+--------+
| Josephine |   Frank   |  Shotgun  |   YES  | NO |   5    |
+-----------+-----------+-----------+--------+----+--------+
| Josephine |   Frank   |  Shotgun  |   NO   | NO |   3    |
+-----------+-----------+-----------+--------+----+--------+
| Miguel    |   Frank   |   Knife   |   NO   | NO |   1    |
+-----------+-----------+-----------+--------+----+--------+

この例のテーブルを使用すると、上記のクエリは次のようなテーブルを返します。

+-----------+--------+
|  killer   | amount |
+-----------+--------+
| Josephine |   22   |
+-----------+--------+
|  Miguel   |   1    |
+-----------+--------+

私が出力したいのは次のとおりです。

+-----------+-------------+--------------+-----------------+
|  killer   | total_kills | conced_kills | victim_had_flag |
+-----------+-------------+--------------+-----------------+
| Josephine |      22     |      5       |        0        |
+-----------+-------------+--------------+-----------------+
|  Miguel   |      1      |      0       |        0        |
+-----------+-------------+--------------+-----------------+

特定のプレイヤーが他のプレイヤーに殺された頻度、彼らが彼を殺した合計回数、認められたキルの量、プレイヤーが彼らに殺されたときに旗を持っていた頻度を示します。

それを達成する方法がよくわかりませんが、試してみGROUP BY kill_stats.killer_id, kill_stats.concedましたが、結果は次のとおりです。

+-----------+--------+
|   killer  | amount |
+-----------+--------+
| Josephine |   14   |  -> the ones with kill_stats.conced = NO
+-----------+--------+
| Josephine |   5    |  -> the ones with kill_stats.conced = YES
+-----------+--------+
| Miguel    |   1    |  -> the ones with kill_stats.conced = NO (only row for that `killer_id`)
+-----------+--------+

複数の行を取得し、すべてのデータを保持するごとに1 つkiller_idの行が必要です。killer_id

Ike Walkerのソリューションは、私が探していたものとほとんど同じでした。私が望んでいたように機能させるための最終的なクエリは次のとおりです。

SELECT alias.name killer,
       SUM(kill_stats.amount) as total_kills ,
       SUM(CASE WHEN kill_stats.conced then kill_stats.amount ELSE 0 END) as conced_kills ,
       SUM(CASE WHEN kill_stats.fc then kill_stats.amount ELSE 0 END) as victim_had_flag 
    FROM kill_stats
        JOIN pickup ON pickup.logfile = 'CTFCL-20130813-1456-shutdown2'
        JOIN account ON account.steam_id = '0:1:705272'
        JOIN player victim ON victim.pickup_id = pickup.id AND victim.account_id = account.id
        JOIN player killer ON killer.pickup_id = pickup.id AND kill_stats.killer_id = killer.id
        JOIN alias ON killer.alias_id = alias.id
WHERE kill_stats.victim_id = victim.id AND NOT killer.team_id = victim.team_id
GROUP BY kill_stats.killer_id
ORDER BY amount DESC

最終的に私を正しい軌道に乗せた彼のソリューションとの違いは、列が1に設定されている各行の新しい列に常にSUM() kill_stats.mountを入れる必要があることです。conced_killsBIT(1)

4

2 に答える 2

1

これを行う標準的な方法は、セカンダリ カウントSUM()と組み合わせることです。CASE

探している出力を提供するために、このように書き直されたクエリの例を次に示します。

SELECT alias.name killer,
       SUM(kill_stats.amount) as total_kills ,
       SUM(CASE WHEN kill_stats.conced then 1 ELSE 0 END) as conced_kills ,
       SUM(CASE WHEN kill_stats.fc then 1 ELSE 0 END) as victim_had_flag 
FROM kill_stats
        JOIN pickup ON pickup.logfile = 'CTFCL-20130813-1456-shutdown2'
        JOIN account ON account.steam_id = '0:1:705272'
        JOIN player victim ON victim.pickup_id = pickup.id AND victim.account_id = account.id
        JOIN player killer ON killer.pickup_id = pickup.id AND kill_stats.killer_id = killer.id
        JOIN alias ON killer.alias_id = alias.id
WHERE kill_stats.victim_id = victim.id AND NOT killer.team_id = victim.team_id
GROUP BY kill_stats.killer_id
ORDER BY amount DESC
于 2013-08-14T17:59:15.967 に答える
0

クエリのSELECTリストを次のように変更してみてください。

SELECT alias.name killer,
   SUM(kill_stats.amount) amount,
   SUM(kill_stats.conced) conced_kills,
   SUM(kill_stats.fc) victim_had_flag

...そして、FROM kill_stats投稿したとおりに正確に仕上げます。concedtrue の場合は 1、false の場合は 0 になると想定しています。と同じfcfcまた、 「被害者にフラグがあった」ことを示していると想定しています。

于 2013-08-14T17:59:49.547 に答える