簡體   English   中英

從單個表的一行中添加多行

[英]Add multiple rows in just one row from a single table

我怎樣才能通過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

我不確定該怎么做? 我應該創建視圖還是表格?

我想一個觀點會很好。

我同意其他答案, 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

使用以下查詢,獲取姓名和他/她的主題。

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

然后,在PHP中,可以使用implode函數打印主題。

希望這可以幫助。

sqlfiddle上的演示

嘗試使用GROUP BY和GROUP_CONCAT

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

然后在獲取記錄時使用PHP函數explode來獲取存儲在Subjects_list列中的不同值。

不好看!

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

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 ,而沒有提到四個主題。

有一種請求會導致強制執行SQL代碼,這通常是SQL的目的。

為了解釋以上內容:我們使用GROUP_CONCAT ,然后再將其分解成碎片。 由於元素可能少於4個 ,因此我們用逗號( ',,,' )填充。 然后,我們根據每個字符串在串聯字符串中的位置將其斷開,如果為空,則返回NULL

就美而言,不能說這是我更好的答案之一。 希望對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM