交叉表查询

时间:2011-05-25 19:15:32

标签: mysql

我有三张桌子。

当然
idcourse
命名

标记
idmark
idstudent
idcourse
标记

学生
idstudent
命名

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

studentid   course1 course2 ... courseN

id1 mark1 mark2 ... markN
id2 mark1 mark2 ... markN
id3 mark1 mark2 ... markN

2 个答案:

答案 0 :(得分:2)

最好我能想到是否要使用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

答案 1 :(得分:0)

首先,你应该有多对一的foreign key关系,以确保表格中的idstudent字段取决于学生表idstudent字段(标记,课程)匹配。

要回答您的具体问题,无法从数据库客户端返回此类结果。也许如果你把一些东西写成一个程序,而不是基本的SQL。获得所需结果的最佳方法是在标记表上进行简单查询以获取idstudent并标记字段,然后用另一种语言在外部操作它们。

所以查询将是这样的:

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

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