我正在尝试从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
因此,如果他们有一个仍然活着的角色,那么从profile
和player_current_life
总共杀死总数,如果他们没有,则只从{{1 }}
这是我为了更好地解释我想要实现的目标而制作的视觉表。
profile
输出应为:
Player1 Kills = 33(25 + 8)
Player2 Kills = 12(12 + 0)
Player3 Kills = 14(9 + 5)
谢谢!
答案 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 + ...
因为当前生命表中的每个元组都会添加一次总玩家杀戮,而不是每个玩家一次。