0

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

在此处输入图像描述

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

在此处输入图像描述

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

而且,在将这张表打印到纸上时,如何删除所有“NULL”并用空白替换它......?

4

1 回答 1

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
;

在 SQLFiddle 上查看

但是,同样,保存学生的分数是学生分数的倍数,这也是一个坏主意。最好studentsidname列创建一个表,并通过id. 并且为所有可能的标记保存包含列的记录也是一个坏主意。最好创建一个courses包含idcourse列的表,以及一个包含marks和列的表。这在数据大小和灵活性方面是最佳的(您可以自由定义任意数量的课程)。student_idcourse_idmark

于 2013-02-20T09:31:04.657 回答