Mysql 交叉表查询

Mysql 交叉表查询,mysql,Mysql,我有三张桌子 课程 idcourse 名称 标记 idmark idstudent idcourse 标记 学生 idstudent 名称 如何将查询交叉到这样的结果? 结果 表格标题 studentid course1 course2 ... courseN id1 mark1 mark2 ... markN id2 mark1 mark2 ... markN id3 mark1 mark2 ... markN 学生I

我有三张桌子

课程
idcourse
名称

标记
idmark
idstudent
idcourse
标记

学生
idstudent
名称

如何将查询交叉到这样的结果?
结果
表格标题

studentid course1 course2 ... courseN
id1 mark1 mark2 ... markN
id2 mark1 mark2 ... markN
id3 mark1 mark2 ... markN 学生ID课程1课程2。。。科森
id1标记1标记2。。。马克
id2标记1标记2。。。马克
id3标记1标记2。。。马克
我能想到的最好方法是使用
group\u concat
功能。
因为可变的列数只是维护的噩梦。
您可以使用php中的列表或客户端中的任何逗号分隔符来分隔
coursegrades
字段中的值

  /*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。获取所需结果的最佳方法是对标记表进行简单查询,以获取idstudent和mark字段,然后用另一种语言在外部操作它们

因此,查询如下所示:

SELECT marks.idstudent, marks.mark, courses.name FROM marks,courses
WHERE marks.idcourse=courses.idcourse;

例如,您可以使用用PHP或Python编写的外部程序显示结果。

看起来像是临时表或存储过程的作业。一种简单的方法是使用联接返回
id1 mark1
id1 mark2
id1 mark3
…等。不过,我不认为有一个列数可变的查询是“好做法”。如果
id1
的结果少于
id2
的结果,那么预期的结果是什么--NULL?因此预期的结果为NULL或0这更像是一个显示问题,而不是检索问题。做一个3路连接查询很简单。让你的应用程序进行水平查看要比让一个查询来为你做要容易得多,所以你建议在客户端创建这个查询?正如Johan解释的,使用SQL返回这些类型的结果并不是一个好主意。