复杂的Mysql查询?在相同匹配的同一侧汇总值

时间:2016-03-07 21:33:15

标签: mysql sql

  heroname  dmg    matchid  side
1 Fiora     700    match1   side1
2 Vayne     850    match1   side1
3 Katarina  300    match1   side1
4 Riven     200    match1   side2
5 Katarina  12390  match2   side1
6 Fiora     200    match3   side2
7 Vayne     500    match3   side2
8 Katarina  800    match3   side2

当Fiora,Vayne和Katarina在比赛中站在同一侧时,我的查询应该总结DMG。

如果用户在输入中键入Fiora Vayne和Katarina,该网站应显示:

Heros                 DMG
Fiora Vayne Katarina 3350

3350< =行的总和1 2 3 6 7 8 dmgs。

第二名“卡塔琳娜”(第5排)并不算数,因为它在另一场比赛中独自一人。其中没有Fiora和Vayne。

如果用户以输入形式输入Riven Fiora Katarina

不应该显示任何结果,因为它们不在同一侧。 Riven在第2侧,而fiora和katarina在第1侧。

我该怎么做..

对我来说太复杂了。我的英语不足以用语言正确地说出问题。我希望你能理解我想要的东西。我坚持这个,我不能这样做。我希望我不会得到很多事。

1 个答案:

答案 0 :(得分:3)

试试这个:

SELECT 'Fiora, Vayne, Katarina' AS heroes, 
       SUM(sum_dmg)
FROM (
  SELECT SUM(dmg) AS sum_dmg
  FROM mytable
  WHERE heroname  IN ('Fiora', 'Vayne', 'Katarina')
  GROUP BY matchid, side
  HAVING COUNT(DISTINCT heroname) = 3) AS t

子查询使用分组来识别同一侧具有所有指定玩家的匹配。它会为所有这些玩家返回SUMdmg值。外部查询只计算总和。

修改

对于更通用的解决方案,您可以按照@Gordon的建议使用GROUP_CONCAT

SELECT heroes, 
       SUM(sum_dmg)
FROM (
  SELECT GROUP_CONCAT(DISTINCT heroname ORDER BY heroname) AS heroes,
         SUM(dmg) AS sum_dmg
  FROM mytable
  GROUP BY matchid, side
  HAVING COUNT(DISTINCT heroname) = 3) AS t
GROUP BY heroes

Demo here