簡體   English   中英

將包含數組的 SQL 字段拆分為新表/行

[英]Split SQL field containing array into new table/rows

我需要一個當前存儲在較大表的單個字段中的用戶 ID 列表( course_user_id s)。

我有一個表叫做courses包含與課程信息course_idcourse_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 塊信息:

  1. 學生人數 (a: 3 :{...) -- 不需要
  2. 每個學生數組的順序/鍵 ({i: 0 ;… i: 1 ;… i: 2 ; …}) -- 也不需要
  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_idcourse_user_id的值,但不是優先級:)

| …         | …              |
------------------------------
| 2         | …              |
------------------------------
| 2         | …              |
------------------------------
| 97        | …              |
------------------------------
| 97        | …              |
------------------------------
| …         | …              |
------------------------------

注意: course_user_id長度可以不同(有些是 5 位數字,有些是 6 位數字)

任何想法將不勝感激!

更新

我的用戶表中確實有user_id可以映射到course_studentscourse_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_idarray index之間沒有重疊,則上述查詢工作正常。 如果重疊,請使用where-clause過濾數據

如果我正確地實現了您的目標,那么您就有了users表。 {i:0;i:12345;i:1;i:22345;i:2;i:323456; 相等users.id=12345users.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.

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