【问题标题】:How to grab data through a link table and pivot rows to columns如何通过链接表获取数据并将行旋转到列
【发布时间】:2021-04-18 16:23:59
【问题描述】:

我正在尝试通过链接表从我的一个表中获取一些数据,并将多行输出为一列 - 这是一个个人项目,旨在帮助我学习,因为我对 SQL 还很陌生而且我什至不确定要搜索什么 - 我已经查找了我能找到的内容,但没有成功。

我拥有的是

表 1 - 播放

id name
1 gamename1
2 gamename1
3 gamename2

表 2 - 玩家

id name
1 playername1
2 playername1
3 playername2

链接表

play_id players_id
1 1
1 2
1 3
2 2
3 2
3 3

我希望看到的内容(不必完全匹配,而是显示每个 play_id 的所有玩家,每行一个 play_id)

Game id Player name1 Player name2 Player name3
gamename1 name1 name2 name3
gamename1 name2
gamename2 name2 name3

我认为这会起作用,但它没有,我能够获得每场比赛的第一个玩家(使用 group by),或者如果我删除它,我会为我的链接表中的每个条目获得一行.

SELECT
    plays.name,
    players.name
FROM
    plays
    INNER JOIN linktable
        ON linktable.play_id = play.id
    INNER JOIN players
        ON linktable.players_id = players.id
GROUP BY
    plays.id

提前感谢你们的帮助!

【问题讨论】:

  • 请提供样本数据和所需的输出
  • 对不起,eshirvana - 我不经常使用 stackoverflow,我是用手机写的,但我已经完成了你现在要求的 :)
  • 你需要使用pivot

标签: sql mariadb


【解决方案1】:

考虑从Linktable 开始,然后是LEFT JOININNER JOIN,如果没有孤立链接)到查找表PlaysPlayers。然后运行条件聚合以进行透视:

SELECT p.`name` AS gamername
     , CASE WHEN ps.id = 1 THEN ps.name END AS Player_name_1
     , CASE WHEN ps.id = 2 THEN ps.name END AS Player_name_2
     , CASE WHEN ps.id = 3 THEN ps.name END AS Player_name_3

FROM linktable l
LEFT JOIN plays p
   ON l.play_id = p.id
LEFT JOIN players ps
   ON l.player_id = ps.id
ORDER BY p.id;

Online Demo

gamername Player_name_1 Player_name_2 Player_name_3
gamename1 playername1 NULL NULL
gamename1 NULL playername2 NULL
gamename2 NULL NULL playername3
gamename3 NULL playername2 NULL
gamename3 NUL playername2 NULL
gamename3 NULL NULL playername3

如果你汇总更好:

SELECT p.`name` AS gamername
     , MAX(CASE WHEN ps.id = 1 THEN ps.name END) AS Player_name_1
     , MAX(CASE WHEN ps.id = 2 THEN ps.name END) AS Player_name_2
     , MAX(CASE WHEN ps.id = 3 THEN ps.name END) AS Player_name_3

FROM linktable l
LEFT JOIN plays p
   ON l.play_id = p.id
LEFT JOIN players ps
   ON l.player_id = ps.id
GROUP BY p.`name`;
gamername Player_name_1 Player_name_2 Player_name_3
gamename1 playername1 playername2 playername3
gamename2 NULL playername2 NULL
gamename3 NULL playername2 playername3

【讨论】:

  • 这很完美!非常感谢!
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多