我需要一个用户 ID (course_user_id
) 的列表,该列表当前存储在一个较大表的单个字段中。
我有一个名为 courses
的表,其中包含带有 course_id
和 course_students
的类(class)信息:
-----------------------------------------------------------
| 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 个信息 block :
- 学生人数 (a:3:{...) -- 不需要
- 每个学生数组的顺序/键 ({i:0;… i:1;… i:2; …}) -- 也不需要
course_user_id
(i: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
,因为有些学生注册了多个类(class),我想查看每个实例/组合。
最佳答案
让我们假设您有一个名为 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
关于mysql - 将包含数组的 SQL 字段拆分为新表/行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32404093/