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侧。
我该怎么做..
对我来说太复杂了。我的英语不足以用语言正确地说出问题。我希望你能理解我想要的东西。我坚持这个,我不能这样做。我希望我不会得到很多事。
答案 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
子查询使用分组来识别同一侧具有所有指定玩家的匹配。它会为所有这些玩家返回SUM
个dmg
值。外部查询只计算总和。
修改强>
对于更通用的解决方案,您可以按照@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