问题描述
|
我有三张桌子。
课程
课程
名称
标记
标识
学生
课程
标记
学生
学生
名称
如何交叉查询这样的结果?
结果
表头
学生编号课程1课程2 ...课程N
id1 mark1 mark2 ... markN
id2 mark1 mark2 ... markN
id3 mark1 mark2 ... markN
解决方法
最好,我可以考虑是否使用
group_concat
函数。
因为列数的变化只是维护的噩梦。
您可以将coursegrades
字段中的值除以exploding
在php中的列表或客户端中任何逗号分隔符之间。
/*First make a list of coursenames for the header.*/
SELECT \'studentid\' as idstudent,\'studentname\' as studentname,GROUP_CONCAT(course.name ORDER BY couselist.idcourse) as coursegrades
FROM course
INNER JOIN (SELECT DISTINCT idcourse FROM mark) courselist
ON (courselist.idcourse = course.idcourse)
UNION ALL
/*UNION ALL this with a list of grades per course*/
SELECT idstudent,student.name as studentname,GROUP_CONCAT(IFNULL(mark.mark,\'\') ORDER BY courselist.idcourse) as coursegrades
FROM course
INNER JOIN (SELECT DISTINCT idcourse FROM mark) courselist
ON (courselist.idcourse = course.idcourse)
LEFT JOIN mark ON (mark.idcourse = courselist.idcourse)
INNER JOIN student ON (student.idstudent = mark.idstudent)
GROUP BY student
,首先,您应该具有多对一的外键关系,以确保根据学生表的idstudent字段(标记,课程)匹配表中的idstudent字段。
为了回答您的特定问题,不可能从数据库客户端返回这样的结果。也许如果您将某些内容作为过程编写,但不是使用基本SQL编写的。获得所需结果的最佳方法是对mark表进行简单查询,以获取idstudent和mark字段,然后使用另一种语言在外部进行操作。
因此查询将如下所示:
SELECT marks.idstudent,marks.mark,courses.name FROM marks,courses
WHERE marks.idcourse=courses.idcourse;
例如,您可以使用用PHP或Python编写的外部程序显示结果。