SQL - 如果找到多个结果,则选择合并行

时间:2014-04-11 01:50:51

标签: mysql sql database

我有一个类似于此的SQL表设置:

name   |  subject |
-------+----------+
Harry  | Painting |
Sandra | Soccer   | 
Sandra | English  |

如果有多个主题,我怎么能写一个合并行的select语句,所以它会输出如下结果:

name   |  subject 1 |  subject 2 |
-------+------------+------------+
Harry  | Painting   |            |
Sandra | Soccer     |   English  |

4 个答案:

答案 0 :(得分:0)

你不应该。最好的方法是加入表格,以便:

  • 哈利,绘画
  • 桑德拉,足球
  • 桑德拉,英文

然后用脚本语言(PHP等)处理这些行,将其转换为您想要的分层数据结构

在上面的例子中,当每人有3个科目,10,100等时会发生什么。

SQL仅适用于二维数据。对于三维,您需要按照我的建议进行预处理/后处理,或者转移到NoSQL mongoDB,处理结构化对象而不是表行。

答案 1 :(得分:0)

由于您提到最大主题数仅为2,因此您可以为每个名称生成一个序号,并用它来旋转列。

SELECT  Name,
        MAX(CASE WHEN rn = 1 THEN Subject END) Subject1,
        MAX(CASE WHEN rn = 2 THEN Subject END) Subject2
FROM
(
    SELECT  A.name, 
            A.subject, 
            (
                SELECT  COUNT(*)
                FROM    tableName c
                WHERE   c.name = a.name AND
                        c.subject <= a.subject) AS rn
    FROM    TableName a
) aa
GROUP BY Name

以上是SQL方式。

答案 2 :(得分:0)

您需要PIVOT例行程序。在您选择的引擎中为此进行搜索。

有些RDBMS内置了这个。在CASE子句中有一个使用SELECT语句的替代方法,其中有很多博客文章。

答案 3 :(得分:0)

您可以使用substring_index()group_concat() this (SQLfiddle)

的组合在一个声明中完成此操作
SELECT DISTINCT s.name, 
       substring_index(p.subject_list, ',', 1) AS "subject_1",
       IF(instr(p.subject_list, ','), 
          substring_index(p.subject_list, ',', -1), 
          NULL
       ) AS "subject_2"
  FROM subjects s
  JOIN (SELECT name, GROUP_CONCAT(subject) AS "subject_list"
          FROM subjects
         GROUP BY name
       ) p on p.name = s.name
;