大家早上好/晚上好,
我正在尝试(LEFT)将两个表联接到一个表中,并SUM()
匹配ON fk_id = id...
语句的特定列的值。表格如下所示:
ws1表:
ws2表:
到目前为止我尝试过的查询:
SELECT
alias.name alias,
(SUM(IFNULL(ws1.teamkills,0)) + SUM(IFNULL(ws2.teamkills,0))) teamkills
FROM pickup
JOIN player ON player.pickup_id = pickup.id
JOIN alias ON player.alias_id = alias.id
LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id
结果:
和:
SELECT
alias.name alias,
(SUM(DISTINCT IFNULL(ws1.teamkills,0)) + SUM(DISTINCT IFNULL(ws2.teamkills,0))) teamkills
FROM pickup
JOIN player ON player.pickup_id = pickup.id
JOIN alias ON player.alias_id = alias.id
LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id
结果:
我了解SUM(DISTINCT.... )
return 2
,因为DISTINCT
仅选择一个具有相同值的结果。
我的目标是获取SUM()
两个teamkills
字段的并将它们加在一起。在这个例子中,它应该返回3
哪里player_id
是4
。我怎样才能做到这一点?
编辑:
表“玩家”:
表“提取”:
您需要两个从属子查询,而不是ws1 + ws2的联接,jonin在这里不起作用。
就像是:
SELECT id, player_alias,
( SELECT sum( teamkills ) FROM ws1
WHERE ws1.player_id = player.id )
+
( SELECT sum( teamkills ) FROM ws2
WHERE ws2.player_id = player.id ) as total
FROM player
JOIN alias ON ......
这里是SQLFiddle demo
,请查看第一个查询(以及下面的结果集)以更好地理解为什么您从联接中得到错误的结果,以及通常来说联接是如何工作的。
联接将一个表中的每个记录组合(粘合)到另一表中的所有符合记录(符合联接条件)的记录(在您的情况下,它会产生4行,其中包含重复的数据)。
此演示中的第三个查询是一个给出正确结果的相关子查询的示例(例如此演示中的数据)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句