あなたは必要ありません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でご覧ください
しかし、繰り返しになりますが、学生が持っているマークの数倍の名前を保存することも悪い考えです。と列を使用してテーブルを作成し、students
。で参照することをお勧めします。また、考えられるすべてのマークの列を含むレコードを保存することもお勧めできません。と列を含むテーブルと、、と列を含むテーブルを作成することをお勧めします。これは、データサイズと柔軟性の点で最適です(必要な数のコースを自由に定義できます)。id
name
id
courses
id
course
marks
student_id
course_id
mark