2014-04-11 57 views
0

我有類似這樣的SQL表設置:SQL - 選擇合併行,如果多個結果發現

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

我怎麼能寫,如果他們有多個主題是融合了行的select語句,所以它會輸出如下結果:

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

每人修復('name')主體的數量做到這一點?否則,你需要閱讀更多關於動態的內容。 –

+0

你爲什麼需要那個? – zerkms

+2

如果可以將合併的主體合併到一個列中,請使用「GROUP_CONCAT」。否則,請參閱http://stackoverflow.com/questions/7674786/mysql-pivot-table – Barmar

回答

0

您不應該這樣做。最好的辦法是加入了表,以便您有:

  • 哈利,繪畫
  • 桑德拉,足球
  • 桑德拉,英語

,然後再處理您的腳本語言,這些行(PHP等等)把它變成你想要的分層數據結構

在你上面的例子中,當每個人有3個主題,10,100等時會發生什麼。

SQL僅適用於二維數據。對於三個維度,您可能需要按照我的建議預/後處理,或者移動到像NoSQL mongoDB那樣處理結構化對象而不是錶行。

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方式。

0

您需要一個PIVOT例程。在您選擇的引擎中選擇Serach。

有些RDBMS具有這種內置功能。在SELECT子句中有一個使用CASE語句的替代方法,對此,有許多博客文章。

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 
;