mysql - 将包含数组的 SQL 字段拆分为新表/行

标签 mysql sql arrays join string-matching

我需要一个用户 ID (course_user_id) 的列表,该列表当前存储在一个较大表的单个字段中。

我有一个名为 courses 的表,其中包含带有 course_idcourse_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 :

  1. 学生人数 (a:3:{...) -- 不需要
  2. 每个学生数组的顺序/键 ({i:0;… i:1;… i:2; …}) -- 也不需要
  3. 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_idcourse_user_id分值,但不是优先级:)

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

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

任何想法将不胜感激!

更新

我的用户表确实有 user_id,它可以映射到 course_studentscourse_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_idarray index 之间没有重叠,上述查询工作正常。如果重叠,请使用 where-clause

过滤数据

关于mysql - 将包含数组的 SQL 字段拆分为新表/行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32404093/

相关文章:

sql - 这些 postgres 关键字如何协同工作?

javascript - Angular JS 使用与其他行不同的控件将行添加到 ng-repeat 表中

c++ - Visual C++ 2010 - 转换 10 GB BYTE 数组的最快方法?

mysql - 我如何优化这个联合查询

Mysql如何将列与前一列求和

mysql - 如何查询以日期命名的一系列表

SQL 连接填充 tempDB

c++ - 在 C++ 中查找等价类数量的有效方法

php - 将多个选择从下拉列表存储到数据库的最佳方法是什么?

mysql - SubSonic 生成命名空间,但我的网站无法识别它。