我有一张表,其结构如下图所示:
我需要编写查询,使得只有n行,其中n是上表中不同名称的总数。并且,每个名称的各列中的所有条目都应包含在该行本身中。最终输出应如下所示:
我首先考虑使用UNION运算符,但是,无法使用它,因为,我不确定表中存在的各种列。也就是说,我不知道表中的列,因为可能会在运行时插入新列。但是,我有一个额外的优势,列数将是7,这将始终是相同的。我唯一不知道的是他们的名字。
并且,当将此表打印到纸上时,如何删除所有“NULL”并将其替换为空白??
答案 0 :(得分:0)
您不需要UNION
,需要GROUP BY
。
看起来你假设某个学生没有几个非NULL值。
动态更改表结构是个坏主意。更好地在附加表中存储标记的名称。这样您的查询将如下所示:
SELECT name
, IF(MAX(mark1) IS NOT NULL, MAX(mark1), '') AS mark1
, IF(MAX(mark2) IS NOT NULL, MAX(mark2), '') AS mark2
, IF(MAX(mark3) IS NOT NULL, MAX(mark3), '') AS mark3
, IF(MAX(mark4) IS NOT NULL, MAX(mark4), '') AS mark4
, IF(MAX(mark5) IS NOT NULL, MAX(mark5), '') AS mark5
, IF(MAX(mark6) IS NOT NULL, MAX(mark6), '') AS mark6
FROM name_marks
GROUP BY name
;
但是,再一次,保存姓名的次数是学生的标记次数,这也是一个坏主意。最好使用students
和id
列创建表name
,并通过id
引用它。并且为所有可能的标记保存包含列的记录也是一个坏主意。最好创建一个包含courses
和id
列的course
表,以及一个包含marks
,student_id
和{{1}的表course_id
}} 列。这在数据大小和灵活性方面是最佳的(您可以根据需要自由定义多个课程)。