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でご覧ください

しかし、繰り返しになりますが、学生が持っているマークの数倍の名前を保存することも悪い考えです。と列を使用してテーブルを作成し、students。で参照することをお勧めします。また、考えられるすべてのマークの列を含むレコードを保存することもお勧めできません。と列を含むテーブルと、、と列を含むテーブルを作成することをお勧めします。これは、データサイズと柔軟性の点で最適です(必要な数のコースを自由に定義できます)。idnameidcoursesidcoursemarksstudent_idcourse_idmark

于 2013-02-20T09:31:04.657 に答える