我有一个表,其结构如下图所示:
我需要编写查询,使得只有 n 行,其中 n 是上表中不同名称的总数。并且,每个名称的各个列中的所有条目都应包含在该行本身中。最终输出应如下所示:
我首先考虑使用 UNION 运算符,但无法使用它,因为我不确定表中存在的各种列。也就是说,我不知道表中的列,因为可能会在运行时插入新列。但是,我有一个额外的优势,列数将是 7,这将始终相同。我唯一不知道的是他们的名字。
而且,在将这张表打印到纸上时,如何删除所有“NULL”并用空白替换它......?
我有一个表,其结构如下图所示:
我需要编写查询,使得只有 n 行,其中 n 是上表中不同名称的总数。并且,每个名称的各个列中的所有条目都应包含在该行本身中。最终输出应如下所示:
我首先考虑使用 UNION 运算符,但无法使用它,因为我不确定表中存在的各种列。也就是说,我不知道表中的列,因为可能会在运行时插入新列。但是,我有一个额外的优势,列数将是 7,这将始终相同。我唯一不知道的是他们的名字。
而且,在将这张表打印到纸上时,如何删除所有“NULL”并用空白替换它......?
你不需要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
course_id
mark