交叉表查询

问题描述

| 我有三张桌子。 课程 课程 名称 标记 标识 学生 课程 标记 学生 学生 名称 如何交叉查询这样的结果?  结果 表头 学生编号课程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编写的外部程序显示结果。