我有一张这样的表
学生表
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
答案 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_SET和GROUP_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