[英]Split SQL field containing array into new table/rows
我需要一個當前存儲在較大表的單個字段中的用戶 ID 列表( course_user_id
s)。
我有一個表叫做courses
包含與課程信息course_id
和course_students
這樣:
-----------------------------------------------------------
| course_id | course_students |
----------------------------------------------------------
| 1 | a:3:{i:0;i:12345;i:1;i:22345;i:2;i:323456;} |
-----------------------------------------------------------
| 2 | a:32:{ … } |
-----------------------------------------------------------
course_students
部分包含 3 塊信息:
course_user_id
(ⅰ:12345; ... I:22345; ... I:32345) 我只需要course_user_id
和原始course_id
,從而生成一個新表,我可以將其用於連接/子查詢,如下所示:
------------------------------
| course_id | course_user_id |
------------------------------
| 1 | 12345 |
------------------------------
| 1 | 22345 |
------------------------------
| 1 | 323456 |
------------------------------
(理想情況下能夠繼續打破其他course_id
和course_user_id
的值,但不是優先級:)
| … | … |
------------------------------
| 2 | … |
------------------------------
| 2 | … |
------------------------------
| 97 | … |
------------------------------
| 97 | … |
------------------------------
| … | … |
------------------------------
注意: course_user_id
長度可以不同(有些是 5 位數字,有些是 6 位數字)
任何想法將不勝感激!
我的用戶表中確實有user_id
可以映射到course_students
或course_user_id
,所以這是從下面一個非常有用的觀察。
我還認為我需要使用LEFT JOIN
因為有些學生注冊了多門課程,我希望看到每個實例/組合。
讓我們假設您有一個表名users
,其中包含所有用戶數據和user_id
。
現在您可以通過以下方式加入表格courses
和表格users
:
select c.course_id,u.user_id
from
courses c
join users u
on u.user_id=if(instr(c.course_students,concat(":",u.user_id,";"))>0,u.user_id,c.course_students)
您可以根據您的要求獲得結果。 在http://sqlfiddle.com/#!9/3667d/2驗證
注意:如果user_id
和array index
之間沒有重疊,則上述查詢工作正常。 如果重疊,請使用where-clause
過濾數據
如果我正確地實現了您的目標,那么您就有了users
表。 和{i:0;i:12345;i:1;i:22345;i:2;i:323456;
相等users.id=12345
, users.id=22345
等。
如果我的猜測是正確的,您可以嘗試以下解決方案:
http://sqlfiddle.com/#!9/cfef27/5
SELECT * FROM courses
LEFT JOIN users u
ON courses.course_students LIKE CONCAT('%i:',u.id,';%')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.