0

unique_idMySQLの列で結合された2つのテーブルからレコードを選択しようとしています。

テーブルprofileには、プレーヤーごとに1つの一意のエントリが含まれています。

テーブルplayer_current_lifeには、プレーヤーごとに多くのエントリが含まれplayer_current_life.is_dead = 1、場合によっては1つのエントリが含まれますplayer_current_life.is_dead = 0

プレイヤーが殺され、新しいキャラクターを作成する前にゲームを離れた場合、プレイヤーにはがありませんplayer_current_life.is_dead = 0。彼らのすべての記録はになりますplayer_current_life.is_dead = 1

私がしたい: profile.total_player_kills + player_current_life.player_killsどこplayer_current_life.is_dead = '0'

しかし

player_current_life.is_dead = 0ループ内のそのユーザーに存在しない場合は、プルするだけprofile.total_player_killsです。

これにより、テーブル内のすべてのプレイヤーがループし、過去のライフからの合計キル数(profile.total_player_kills)が表示されますが、死んでいないキャラクター(player_current_life.is_dead = 0)がある場合は、現在のライフキル数もプルします。

私がこれまでに持っているものは、彼らがゲームで生きているキャラクターを持っている場合にのみ機能します。

SELECT sum(profile.total_player_kills + player_current_life.player_kills) AS All_Player_Kills, profile.name AS Player_Name
FROM
  profile
LEFT OUTER JOIN player_current_life
ON profile.unique_id = player_current_life.unique_id AND player_current_life.is_dead = '0'
WHERE
  profile.total_play_time + player_current_life.play_time >= 10
GROUP BY
  profile.name

つまり、まだ生きているキャラクターがいる場合は、profileANDから合計キルをプルし、生きていない場合は、からキルをプルするだけです。player_current_lifeprofile

これは、私が達成しようとしていることをよりよく説明するために作成した視覚的な表です。

profile (only increases when the player dies)
+-------------+-----------+--------------+
| Player_Name | unique_id | player_kills |
+-------------+-----------+--------------+
| Player1     | 12345     | 25           |
+-------------+-----------+--------------+ 
| Player2     | 67890     + 12           |
+-------------+-----------+--------------+
| Player3     | 54321     + 9            |
+-------------+-----------+--------------+

player_current_life (contains kill count not sent to "profile" where is_dead = 0)
+-------------+--------------+-----------+
| unique_id   | player_kills | is_dead   |
+-------------+--------------+-----------+
| 12345       | 8            | 0         |
+-------------+--------------+-----------+
| 12345       | 15           | 1         |
+-------------+--------------+-----------+
| 12345       | 10           | 1         |
+-------------+--------------+-----------+
| 67890       + 7            | 1         |
+-------------+--------------+-----------+
| 67890       + 5            | 1         |
+-------------+--------------+-----------+
| 54321       + 2            | 1         |
+-------------+--------------+-----------+
| 54321       + 7            | 1         |
+-------------+--------------+-----------+
| 54321       + 5            | 0         |
+-------------+--------------+-----------+

出力は次のようになります。

Player1キル=33(25 + 8)

Player2キル=12(12 + 0)

Player3キル=14(9 + 5)

ありがとう!

4

2 に答える 2

0

SELECT句でif()ステートメントを使用できます

SELECT sum(profile.total_player_kills + IF(player_current_life.is_dead = '0', player_current_life.player_kills, 0)) AS All_Player_Kills, profile.name AS Player_Name
FROM
  profile
LEFT OUTER JOIN player_current_life
ON profile.unique_id = player_current_life.unique_id 
WHERE
  profile.total_play_time + player_current_life.play_time >= 10
GROUP BY
  profile.name
于 2013-03-14T15:12:25.427 に答える
0

これはあまり良い習慣ではありませんがis_dead、ライブプレイヤーの場合はゼロ、デッドプレイヤーの場合は常に1の場合(1-is_dead)、ウォームプレイヤーの場合は1、故人の場合は0になります。

その後、次のようなことを行うことができます

SELECT (profile.total_player_kills
    + SUM((1-is_dead) * player_kills)) AS All_Player_Kills,
    profile.name AS Player_Name
FROM
  profile
LEFT OUTER JOIN player_current_life
    ON profile.unique_id = player_current_life.unique_id
WHERE
    profile.total_play_time + player_current_life.play_time >= 10
GROUP BY
    profile.name

死んだ人はplayer_kills0を掛けているので、事実上無視されます。

より良い方法は

SELECT (profile.total_player_kills
    + SUM( CASE WHEN is_dead = 0 THEN player_kills ELSE 0 END) AS ...

これはより堅牢is_deadで、ブール型に簡単に適合させることができます。

さらに良いのは、副選択を使用することです。

SELECT profile.total_player_kills + this_life.total_player_kills AS ...

FROM profile
LEFT OUTER JOIN

    ( SELECT unique_id, SUM(CASE WHEN is_dead = '0' THEN player_kills ELSE 0 END)
      AS total_player_kills
    FROM player_current_life
    GROUP BY unique_id ) AS this_life

ON (profile.unique_id = this_life.unique_id)
WHERE ...

上記のバージョンには、チェックアウトできるSQLFiddleがあります。

注意:あなたのこのコードは正しく機能しない可能性があると思います:

SELECT sum(profile.total_player_kills + ...

なぜなら、プレイヤーのキルの総数は、プレイヤーごとに1回ではなく、現在の生命表のタプルごとに1回追加されるからです。

于 2013-03-14T15:13:22.830 に答える