将包含数组的 SQL 字段拆分为新的 table/rows
Split SQL field containing array into new table/rows
我需要一个用户 ID (course_user_id
s) 列表,该列表当前存储在更大的 table.
的单个字段中
我有一个名为 courses
的 table,其中包含 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 个信息块:
- 学生人数(a:3:{…) -- 不需要
- order/key为每个学生的数组({i:0;… i:1;… i :2; …}) -- 也不需要
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_id
s和course_user_id
s分解值,但不是优先级:)
| … | … |
------------------------------
| 2 | … |
------------------------------
| 2 | … |
------------------------------
| 97 | … |
------------------------------
| 97 | … |
------------------------------
| … | … |
------------------------------
注意:course_user_id
的长度可能会有所不同(有些是 5 位,有些是 6 位)
如有任何想法,我们将不胜感激!
更新
我的用户 table 确实有 user_id
可以映射到 course_students
或 course_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_id
和 array index
之间没有重叠,上述查询工作正常。如果重叠,请使用 where-clause
过滤数据
如果我的目标正确,你就有 users
table。并且 {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,';%')
我需要一个用户 ID (course_user_id
s) 列表,该列表当前存储在更大的 table.
我有一个名为 courses
的 table,其中包含 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 个信息块:
- 学生人数(a:3:{…) -- 不需要
- order/key为每个学生的数组({i:0;… i:1;… i :2; …}) -- 也不需要
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_id
s和course_user_id
s分解值,但不是优先级:)
| … | … |
------------------------------
| 2 | … |
------------------------------
| 2 | … |
------------------------------
| 97 | … |
------------------------------
| 97 | … |
------------------------------
| … | … |
------------------------------
注意:course_user_id
的长度可能会有所不同(有些是 5 位,有些是 6 位)
如有任何想法,我们将不胜感激!
更新
我的用户 table 确实有 user_id
可以映射到 course_students
或 course_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_id
和 array index
之间没有重叠,上述查询工作正常。如果重叠,请使用 where-clause
如果我的目标正确,你就有 users
table。并且 {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,';%')