2013-05-08 41 views
2

這裏的表:TABLE1劃分爲不同的行表的列與MySQL

ID | id_activity | id_elem | text 
--------------------------------------- 
    1 |  1  | 11 | text1 | 
    2 |  1  | 12 | text2 | 
    3 |  1  | 13 | text3 | 
    4 |  2  | 11 | text4 | 
    5 |  2  | 12 | text5 | 
    6 |  2  | 13 | text6 | 
    7 |  3  | 11 | text7 | 
    8 |  3  | 12 | text8 | 
    9 |  3  | 13 | text9 | 
    10 |  4  | 11 | text10 | 
    11 |  4  | 12 | text11 | 
    12 |  4  | 13 | text12 | 
    13 |  5  | 11 | text13 | 
    14 |  5  | 12 | text14 | 
    15 |  5  | 13 | text15 | 
    16 |  6  | 11 | text16 | 
    17 |  6  | 12 | text17 | 
    18 |  6  | 13 | text18 | 

我需要這樣一個結果:

ID | text_elem_11 | text_elem_12 | text_elem_13 
--------------------------------------------------- 
    1 | text1  | text2  | text3  | 
    2 | text4  | text5  | text6  | 
    3 | text7  | text8  | text9  | 
    4 | text10 | text11 | text12 | 
    5 | text13 | text14 | text15 | 
    6 | text16 | text17 | text18 | 

什麼是做到這一點的正確方法?與後續的查詢,我只能得到一個表與第一和第二列

SELECT table1.ID, 
     table1.id_elem, 
     elem_11.text AS text_elem_11 

FROM table1 

INNER JOIN table1 AS elem_11 ON 
table1.id_activity = 1 AND 
table1.id_elem = 11 AND 
elem_11.id_elem = 11 

這是結果

id_activity | id_elem | text_elem_11 | 
----------------------------------------- 
     1  | 11 | text1  | 
     1  | 11 | text4  | 
     1  | 11 | text7  | 

我不知道如何添加其他2列,如果是一個好主意,用一個單一的查詢來做...所以,任何想法?

+1

考慮在應用層處理數據顯示的問題。這種方式更加靈活。 – Strawberry 2013-05-08 17:18:11

回答

1
SELECT id_activity, 
     MAX(CASE WHEN id_elem = 11 THEN text END) text_elem_11, 
     MAX(CASE WHEN id_elem = 12 THEN text END) text_elem_12, 
     MAX(CASE WHEN id_elem = 13 THEN text END) text_elem_13 
FROM TableName 
GROUP BY id_activity 
ORDER BY id_activity 

輸出

╔═════════════╦══════════════╦══════════════╦══════════════╗ 
║ ID_ACTIVITY ║ TEXT_ELEM_11 ║ TEXT_ELEM_12 ║ TEXT_ELEM_13 ║ 
╠═════════════╬══════════════╬══════════════╬══════════════╣ 
║   1 ║ text1  ║ text2  ║ text3  ║ 
║   2 ║ text4  ║ text5  ║ text6  ║ 
║   3 ║ text7  ║ text8  ║ text9  ║ 
║   4 ║ text10  ║ text11  ║ text12  ║ 
║   5 ║ text13  ║ text14  ║ text15  ║ 
║   6 ║ text16  ║ text17  ║ text18  ║ 
╚═════════════╩══════════════╩══════════════╩══════════════╝ 

如果你有數目不詳的id_elem,動態SQL更加優選,

SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('MAX(CASE WHEN id_elem = ', 
       id_elem, 
       ' THEN text ELSE NULL END) AS ', 
       CONCAT('`text_elem_' , id_elem, '`') 
       )) INTO @sql 
FROM TableName 
ORDER BY id_elem; 



SET @sql = CONCAT('SELECT id_activity, ', @sql, ' 
        FROM TableName 
        GROUP BY id_activity 
        ORDER BY id_activity'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

不錯的先生! :) – Lucabro 2013-05-09 07:01:02

1

您正在查找的內容稱爲「select select」或選擇子查詢。

(我已刪除了我最初的想法是,MySQL不支持這樣的東西作爲選擇(選擇表從other_table COLUMN_NAMES))

不幸的是,儘管這樣的支持存在,它可能不是你在尋找什麼,因爲子查詢必須返回單個字面值,而不是列名稱列表。

我在這裏偶然發現另一個關於這個話題的問題:Select MYSQL rows but rows into columns and column into rows - 檢查一下,如果這樣複雜的視圖爲你完成工作。否則,我建議您選擇代碼中的行,然後對它們進行迭代,創建一個將行轉換爲列的新集合 - 如果您希望我可以發佈一些代碼想法,因爲我記得過去曾遇到過這個問題

編輯:我意識到我已經跳了一下解決方案。即使選擇選擇不會幫助你!必須考慮更深一點。有趣的問題!