Sql在一列中有很多id

时间:2018-02-05 04:54:14

标签: mysql

我有一张这样的表

学生

ID | Name | Subject |
1  | foo  | 1,2,3   |

SUBJECT

ID | Subject_name |
1  | Math         |
2  | Science      |
3  | History      |

我试过这个

"SELECT * FROM student LEFT JOIN subject ON student.id = subject.id"

但他们是错误

我期望在学生表中获取所有subject_name

5 个答案:

答案 0 :(得分:4)

您需要使用FIND_IN_SET来查找范围内的值,并使用GROUP_CONCAT以逗号分隔值返回行。

SELECT  s.id, s.Name, GROUP_CONCAT(t.Subject_name)
FROM    student s
        INNER JOIN subject t
            ON FIND_IN_SET(t.ID, s.subject)
GROUP BY s.id, s.Name

这是Demo

但是,请考虑更改表格的架构,因为它目前不是理想的设计。

答案 1 :(得分:1)

使用FIND_IN_SET

SELECT t1.*
FROM subject t1
INNER JOIN student t2
    ON FIND_IN_SET(t1.ID, t2.Subject) > 0
ORDER BY t1.ID;

请注意,FIND_IN_SET不是产生最佳数据库设计的函数,因为通常CSV数据不适合数据库表。话虽如此,您可能需要考虑将student表中的主题分成不同的行。

答案 2 :(得分:0)

最好再创建一个表格来连接student表格和subject表格,例如student_subject将由以下字段组成:id, student_id, subject_id;并且您应该从subject表中删除student字段。

选择查询:

SELECT * /* fields you need */
FROM student
LEFT JOIN student_subject ON student.id = student_subject.student_id
LEFT JOIN student_subject ON subject.id = student_subject.subject_id

答案 3 :(得分:-1)

要获得学生主题表中的所有主题名称,您需要在MySQL中使用FIND_IN_SETGROUP_CONCAT函数。

SELECT  a.id, a.Name, a.Subject,
        GROUP_CONCAT(b.Subject_name ORDER BY b.id) SubjectName
FROM    student a
        INNER JOIN SUBJECT b
            ON FIND_IN_SET(b.id, a.Subject) > 0
GROUP   BY a.id

您可以查看我的演示here

答案 4 :(得分:-1)

你可以尝试这个:       从学生s中选择t.subject_name,在s.id = t.id

上选择t