3

如何通过mysql在一行中加入多行?

例子 :

学生桌

Sno.| Name  |  Subjects
1.  | ABC   |  English
2.  | ABC   |  Mathematics
3.  | ABC   |  Science
4.  | FMC |  French
5.  | ABC   |  Russian
6.  | JBC   |  French

现在我想要这种格式

Sno.| Name |   Sub1 |  Sub2 | Sub3 |  Sub4 |
1.  | ABC |   Eng  |  Maths| Science| Russian
2.  | FMC |    French| Null| Null   | Null
3.  | JBC |   French| Null | Null   | Null

我不知道该怎么做?我应该创建一个视图还是一个表?

我想一个视图会很好。

4

4 回答 4

3

我同意其他答案,GROUP_CONCAT与 PHP 一起拆分逗号分隔值可能是最好的方法,但是如果出于任何其他原因您需要通过 Pure SQL 建议的输出,我会建议以下方法之一。

1. 自加入

SELECT  t1.Name, 
        MIN(t1.Subject) AS Sub1,
        MIN(t2.Subject) AS Sub2,
        MIN(t3.Subject) AS Sub3,
        MIN(t4.Subject) AS Sub4
FROM    Students t1
        LEFT JOIN Students T2 
            ON t1.Name = t2.Name 
            AND t2.Subject > t1.Subject
        LEFT JOIN Students T3 
            ON t2.Name = t3.Name 
            AND t3.Subject > t2.Subject
        LEFT JOIN Students T4 
            ON t3.Name = t4.Name 
            AND t4.Subject > t3.Subject
GROUP BY t1.Name;

2.使用ROW_NUMBER类型函数进行聚合

SELECT   Name,
         MAX(IF(RowNum = 1,Subject, NULL)) AS Sub1,
         MAX(IF(RowNum = 2,Subject, NULL)) AS Sub2,
         MAX(IF(RowNum = 3,Subject, NULL)) AS Sub3,
         MAX(IF(RowNum = 4,Subject, NULL)) AS Sub4
FROM     (    SELECT   Name,
                       Subject,
                       @r:= IF(@Name = Name, @r + 1, 1) AS RowNum,
                       @Name:= Name AS Name2
              FROM    Students,
                      (SELECT @Name:='') n,
                      (SELECT @r:= 0) r
              ORDER BY Name, Sno
          ) t
GROUP BY Name
于 2012-07-16T19:59:39.733 回答
1

使用以下查询,获取姓名和他/她的主题。

SELECT Name, GROUP_CONCAT(Subjects) AS List
FROM myTable
GROUP BY Name

然后在 PHP 中,您可以使用implode函数来打印主题。

希望这可以帮助。

在 sqlfiddle 演示

于 2012-07-16T18:02:56.553 回答
0

尝试使用 GROUP BY 和GROUP_CONCAT

SELECT Name, GROUP_CONCAT(Subjects) AS Subjects_list
FROM students_table
GROUP BY Name

然后在获取记录时使用PHP函数explode来获取存储在Subjects_list列中的不同值。

于 2012-07-16T17:35:31.317 回答
0

不漂亮!

要使用上述解决方案,您可以执行以下操作:

SELECT 
  Sno, 
  Name,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 1), ',', -1), '') AS Sub1,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 2), ',', -1), '') AS Sub2,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 3), ',', -1), '') AS Sub3,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 4), ',', -1), '') AS Sub4
FROM (
  SELECT Sno, Name, CONCAT(GROUP_CONCAT(Subjects ORDER BY Sno),',,,') AS all_subjects FROM table GROUP BY name
) inner_sel
;

您的请求导致假设永远不会超过4 个主题。NULL如果没有提到四个主题,您还需要s。

有一种请求会导致强制执行 SQL 代码,这通常是 SQL 的用途。

解释上述内容:我们使用GROUP_CONCAT,然后再次将其分解。由于可能少于4 个元素,我们用逗号 ( ) 填充',,,'。然后我们根据它在连接字符串中的位置分解每个部分,NULL如果它是空的,则返回。

不能说这是我在漂亮方面更好的答案之一。希望对你有帮助。

于 2012-07-16T18:15:11.730 回答