MySQL Group by,具有分组数据中的命名列

MySQL Group by,具有分组数据中的命名列,mysql,sql,database,pivot,Mysql,Sql,Database,Pivot,我正在写一份记录10针保龄球比赛结果的申请。我已经完成了提交部分,但我仍然坚持显示结果。结构如下: id fixture_id member_id team_id game score 1 1 1 1 1 189 2 1 1 1 2 167 3 1 1 1 3 190 4 1 2

我正在写一份记录10针保龄球比赛结果的申请。我已经完成了提交部分,但我仍然坚持显示结果。结构如下:

id fixture_id member_id team_id game score
 1          1         1       1    1   189
 2          1         1       1    2   167
 3          1         1       1    3   190
 4          1         2       2    1   100
 5          1         2       2    2   167
 6          1         2       2    3   158
在上面的例子中,我假设每个人玩了3个游戏,但是可以玩任意数量的游戏

如何以更友好的格式获取数据

例如:

id - fixture_id - member_id - team_id - game_1 - game_2 - game_3

其中,列game_1、game_2和game_3(等等)对应于该游戏的分数。

您可以使用条件聚合进行透视,但这要求您事先知道要生成多少列。以下解决方案每个用户最多可处理3个游戏(您可以使用更多
max(case…
表达式扩展
select
子句以处理更多游戏):

fixture_id | member_id | team_id | game_1 | game_2 | game_3 ---------: | --------: | ------: | -----: | -----: | -----: 1 | 1 | 1 | 189 | 167 | 190 1 | 2 | 2 | 100 | 167 | 158 赛程|队员|团队|比赛| 1 |比赛| 2 |比赛| 3 ---------: | --------: | ------: | -----: | -----: | -----: 1 | 1 | 1 | 189 | 167 | 190 1 | 2 | 2 | 100 | 167 | 158
您可以尝试在下面的动态脚本中生成所需的结果,而不必知道已经玩了多少个游戏-

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(game = ''',
      game,
      ''', game, NULL)) AS game_',
      game
    )
  ) into @sql
FROM mytable;

set @sql = CONCAT('SELECT id, fixture_id, member_id, team_id, ', @sql, ' from mytable group by id, fixture_id, member_id, team_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这是演示。

这是否回答了您的问题@AnkitBajpai是的。它类似于GMB的答案,但是使用2个表,但是选择的答案提供了进一步的阅读,我可以尝试更多地了解自己。考虑在演示层/应用层代码中处理数据显示的问题,假设您有这个问题(例如,一个简单的PHP循环作用于有序数组)。。这个答案对OP没有帮助,因为他已经提到任何游戏都是动态的,因为任何游戏都不能玩。@AnkitBajpai:我更新了我的答案,明确了这一点。OP已经说过,任何数量的游戏都可以玩。因此,您必须提供足够通用的解决方案。@AnkitBajpai通用答案可能包含无限列。这会使桌子不可读@LelioFaieta,请看我的回答,我想说什么。
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(game = ''',
      game,
      ''', game, NULL)) AS game_',
      game
    )
  ) into @sql
FROM mytable;

set @sql = CONCAT('SELECT id, fixture_id, member_id, team_id, ', @sql, ' from mytable group by id, fixture_id, member_id, team_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;