![](/img/trans.png)
[英]how to select single row from one table and multiple rows from another table toghether?
[英]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建議的輸出,則建議使用以下方法之一。
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;
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
函數打印主題。
希望這可以幫助。
嘗試使用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.