【问题标题】:GROUP BY (a,b) and (b,a)按 (a,b) 和 (b,a) 分组
【发布时间】:2016-07-22 16:05:26
【问题描述】:

我有一张这样的桌子:

player1    player2    player3    player4    score1    score2
   1          2          3          4         11         2  
   1          2          3          4          4         11
   2          1          3          4         11         5

如果我查询:SELECT player1, player2, SUM(score1) FROM mytable GROUP BY player1, player2

我会得到:

player1   player2   SUM(score1)
   1         2          15
   2         1          11

不过,我想同时GROUP BY player1,player2 AND player2,player1,得到:

player   player   SUM(score1)
   1         2         26

有谁知道这是否可能(我使用 MySQL)。

如果不是,你知道用 PHP 做的好方法吗?

【问题讨论】:

  • 规范化你的架构
  • @Strawberry 也许我的桌子不太好,是的。你认为我应该将我的玩家分组到另一张桌子上并有类似的东西:group1, group2, score1, score2 吗?

标签: php mysql sql group-by


【解决方案1】:

您可以使用least()greatest()

select least(player1, player2), greatest(player1, player2), sum(score1)
from mytable
group by least(player1, player2), greatest(player1, player2);

【讨论】:

  • 太完美了,我不知道为什么我没想到。 :)
  • @Strawberry 您可以出于任何原因投反对票,只要您没有特别针对任何用户(而且您不是)。我很好奇为什么你觉得有必要在你做之前发表评论
  • @Strawberry 我明白了,听起来不错。无论如何,我认为您应该对每一个反对票一视同仁
  • @Strawberry 必须对有关次优设计的问题的每个答案都包含一个警告,即答案是设计问题的解决方法?一遍一遍地重复会很乏味,而且当提到它时,您通常会知道 OP 与设计卡住了。
  • @HartCO 不幸的是,我认为是的。范式是 SO 形成了关于各种主题的最佳知识的规范。这里,主题是关系数据的管理。因此,提出的解决方案至少不考虑设计存在缺陷的可能性会欺骗那些来这里学习关系数据库的人。
【解决方案2】:

或者试试这个

select min(player1) as player1,max(player2) as player2, sum(score1) as score1 from
(
select player1, player2, SUM(score1) as score1 FROM mytable GROUP BY player1, player2
) as t 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2021-11-28
    • 2020-07-10
    • 1970-01-01
    • 2014-03-29
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多