在值等于某事物的连接处选择记录,但是当它没有?

时间:2013-03-14 15:02:34

标签: mysql database join

我正在尝试从2个表中选择记录,并在MySQL中通过列unique_id加入。

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 WHERE player_current_life.is_dead = '0'

BUT

如果循环中该用户不存在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

因此,如果他们有一个仍然活着的角色,那么从profileplayer_current_life总共杀死总数,如果他们没有,则只从{{1 }}

这是我为了更好地解释我想要实现的目标而制作的视觉表。

profile

输出应为:

Player1 Kills = 33(25 + 8)

Player2 Kills = 12(12 + 0)

Player3 Kills = 14(9 + 5)

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在SELECT子句中使用if() statement

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

答案 1 :(得分: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_kills乘以0,因此被有效忽略。

更好的方法是

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 + ...

因为当前生命表中的每个元组都会添加一次总玩家杀戮,而不是每个玩家一次。