首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL将多行连接为列

问MySQL将多行连接为列
EN

Stack Overflow用户
提问于 2013-03-17 23:49:18
回答 1查看 21.4K关注 0票数 24

假设我在MySQL数据库中有两个表。

表1:

代码语言:javascript
复制
ID    Name
1     Jim
2     Bob

表2:

代码语言:javascript
复制
ID    Place    Race_Number
1     2nd      1
1     3rd      2
1     4th      3
2     1st      1
2     2nd      2
2     2nd      3

从数据库中选择行时,是否可以将第二个表中的行作为列连接到第一个表中?目前我使用的是SELECT * FROM Table1 NATURAL JOIN Table2。

这将输出以下内容:

代码语言:javascript
复制
ID   Name    Place    Race_Number
1    Jim     2nd      1
1    Jim     3rd      2
1    Jim     4th      3
2    Bob     1st      1
2    Bob     2nd      2
2    Bob     2nd      3

目前,我正在PHP脚本中对其进行排序,以便将其排序到一个数组中。这很痛苦,因为我必须查看if,看看它们是否相同,然后进行相应的排序。我觉得在MySQL中有一种方法可以正确地做到这一点,而不必在PHP中将其排序为数组。对于每个ID,在第二个表中可以有无限数量的条目。

MySQL查询得到的期望结果是:

代码语言:javascript
复制
ID    Name    Race1    Race2    Race3
1     Jim     2nd      3rd      4th
2     Bob     1st      2nd      2nd

我不能在表中为Race1、Race2等列,因为每个ID可以有无限数量的竞争。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-17 23:51:30

一个INNER JOIN就能满足你的需求。MySQL没有PIVOT函数,你仍然可以用CASE和MAX()函数来模拟它。

代码语言:javascript
复制
SELECT  a.ID, a.NAME,
        MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1,
        MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2,
        MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3
FROM    Table1 a
        INNER JOIN Table2 b
            ON a.ID = b.ID
GROUP   BY a.ID, a.Name

但是如果你有未知数量的RACE,那么DYNAMIC SQL会更好。

代码语言:javascript
复制
SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number,
      ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`'))
    ) INTO @sql
FROM Table2;

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
                   FROM Table1 a
                   LEFT JOIN Table2 b 
                        ON ON a.ID = b.ID
                   GROUP   BY a.ID, a.Name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15462753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档