【问题标题】:MySQL select multiple rows with multiple columns from other table in one rowMySQL在一行中从其他表中选择多行和多列
【发布时间】:2014-08-08 07:35:49
【问题描述】:

我正在寻找一种构建给定表格的方法:

TABLE: group                    TABLE: person
-------------------------       -------------------------------------------------
| Group_id | Group_name |      | Person_id | Person_name | Person_fid | Group_id |
-------------------------       -------------------------------------------------
|    1     | Group44    |      |     1     |     John    |      2     |    1     |
-------------------------       -------------------------------------------------
|    2     | Best Group |      |     2     |    George   |      1     |    1     |
-------------------------       -------------------------------------------------
                               |     3     |    Peter    |      2     |    2     |

(表 person 有额外的列,如 person_nickname、person_status 等)

变成这样的结果:(组名、person_fid1 列、person_fid2 列)

 -------------------------------------------------------------------
|  Groupname   | fid1_pname | fid 1_pstat | fid2_pname | fid2_pstat |
 -------------------------------------------------------------------
|   Group44    |   George   |      1      |    John    |      0     |
 -------------------------------------------------------------------
|  Best Group  |   NULL     |   NULL      |    Peter   |      1     |
 -------------------------------------------------------------------

将有 6 个不同的 Person_fid,我需要从中生成列。

如果一个组没有具有特定fid 的人,它可以为这些列显示NULL。 有没有办法做到这一点?

我尝试过使用:

SELECT group.name, MAX(CASE WHEN person.Person_fid = 1 THEN |get column infos|
ELSE NULL, NULL, NULL END) 3 columns fid1, 
MAX(CASE WHEN person.Person_fid = 2 THEN |get column infos|
ELSE NULL, NULL, NULL END) 3 columns fid2

但我不能走得太远,因为我什至不知道如何搜索这种东西。

【问题讨论】:

  • group 是保留字。因此,对于表/列标识符来说,这是一个糟糕的选择。也就是说,你为什么要这样做?
  • fid 1_pstat 哪些列值?你想在单行显示 6 个人吗
  • @Strawberry 我知道这很奇怪,但整个结构最初并不是为了这样的东西而建造的。 (多人)
  • @Sathish 是的 6 个人在一个列中提供了他们的信息,但我已经让一切正常(感谢 Jacky Chengs 的回答)。
  • @OnionHull 实际上,您在寻找比 Jacky 的更优雅的解决方案的正确轨道上 - 尽管我怀疑接受的解决方案如果比您的替代方案快一点。另外,仅供参考,在现代英语中,“Thank a bundle”已成为“That was very unhelpful”的成语!!

标签: mysql pivot multiple-columns


【解决方案1】:

首先将您的表 Group 更改为 Group_info,person_group 等其他名称。因为 group 是一个保留字(它本身有一些功能)。

你需要的sql大概如下(未经测试,但应该可以)

SELECT 
    group_name, 
    t1.person_name as name_1, t1.person_status as stat_1,
    t2.person_name as name_2, t2.person_status as stat_2,
    t3.person_name as name_3, t3.person_status as stat_3,
    t4.person_name as name_4, t4.person_status as stat_4,
    t5.person_name as name_5, t5.person_status as stat_5,
    t6.person_name as name_6, t6.person_status as stat_6,
FROM group_info gi
LEFT JOIN (SELECT person_name,person_status FROM person WHERE person_fid=1) as t1 USING (group_id)
LEFT JOIN (SELECT person_name,person_status FROM person WHERE person_fid=2) as t2 USING (group_id)
LEFT JOIN (SELECT person_name,person_status FROM person WHERE person_fid=3) as t3 USING (group_id)
LEFT JOIN (SELECT person_name,person_status FROM person WHERE person_fid=4) as t4 USING (group_id)
LEFT JOIN (SELECT person_name,person_status FROM person WHERE person_fid=5) as t5 USING (group_id)
LEFT JOIN (SELECT person_name,person_status FROM person WHERE person_fid=6) as t6 USING (group_id)

【讨论】:

  • 非常感谢!我让它工作了。 (顺便感谢保留字信息)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2018-09-27
  • 1970-01-01
相关资源
最近更新 更多