在mysql中规范化表

时间:2013-02-20 01:45:59

标签: mysql database-normalization

我有一张表,其结构如下图所示:

enter image description here

我需要编写查询,使得只有n行,其中n是上表中不同名称的总数。并且,每个名称的各列中的所有条目都应包含在该行本身中。最终输出应如下所示:

enter image description here

我首先考虑使用UNION运算符,但是,无法使用它,因为,我不确定表中存在的各种列。也就是说,我不知道表中的列,因为可能会在运行时插入新列。但是,我有一个额外的优势,列数将是7,这将始终是相同的。我唯一不知道的是他们的名字。

并且,当将此表打印到纸上时,如何删除所有“NULL”并将其替换为空白??

1 个答案:

答案 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
;

See it on SQLFiddle

但是,再一次,保存姓名的次数是学生的标记次数,这也是一个坏主意。最好使用studentsid列创建表name,并通过id引用它。并且为所有可能的标记保存包含列的记录也是一个坏主意。最好创建一个包含coursesid列的course表,以及一个包含marksstudent_id和{{1}的表course_id }} 列。这在数据大小和灵活性方面是最佳的(您可以根据需要自由定义多个课程)。