将包含数组的 SQL 字段拆分为新的 table/rows

Split SQL field containing array into new table/rows

我需要一个用户 ID (course_user_ids) 列表,该列表当前存储在更大的 table.

的单个字段中

我有一个名为 courses 的 table,其中包含 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. order/key为每个学生的数组({i:0;… i:1;… i :2; …}) -- 也不需要
  3. course_user_id (i:12345; … i:22345;… i:32345 ;)

我只需要 course_user_id 和原来的 course_id,生成一个新的 table,我可以像这样用于 joins/subqueries:

------------------------------
| course_id | course_user_id |
------------------------------
| 1         | 12345          |
------------------------------
| 1         | 22345          |
------------------------------
| 1         | 323456         |
------------------------------

(最好能继续为其他course_ids和course_user_ids分解值,但不是优先级:)

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

注意:course_user_id的长度可能会有所不同(有些是 5 位,有些是 6 位)

如有任何想法,我们将不胜感激!

更新

我的用户 table 确实有 user_id 可以映射到 course_studentscourse_user_id,所以这是一个非常有用的观察结果。

我也认为我需要使用 LEFT JOIN 因为有些学生注册了多个课程,我想查看每个 instance/combo.

让我们假设您有一个 table 名称 users,其中包含所有用户数据以及 user_id

现在您可以通过以下方式加入tablecourses和tableusers

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 table。并且 {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,';%')