複数列 - sql 最新日付 条件



MySQL Query-グループバイを使用しているときに不足しているレコードを取得する (3)

私は質問があります:

select score, count(1) as 'NumStudents' from testresults where testid = 'mytestid'
group by score order by score

testresultsテーブルには、テストでの学生の公演が含まれています。 テストの最大マークが10であると仮定すると、サンプル結果は次のようになります。

スコア、NumStudents

0 10
1 20
2 12
3 5
5 34
..
10 23

ご覧のように、このクエリでは、得点がないスコアのレコードは返されません。 たとえば。 テストでは誰も4/10を獲得しておらず、クエリー出力にスコア= 4のレコードがありません。

私はNumStudentsフィールドの値として0でこれらの不足しているレコードを取得できるようにクエリを変更したいと思います。 私の最終的な出力には、可能なスコアごとに1つずつ、最大+1のレコードがあるようにします。

何か案は ?

編集:

データベースにはいくつかのテストが含まれており、テストの最大マークはテスト定義の一部です。 したがって、すべての可能なスコアを格納するための新しいテーブルを持つことは実現可能ではありません。 新しいマークを付けて新しいテストを作成するたびに、これらのスコアを含むように新しいテーブルを変更する必要があります。

https://code.i-harness.com


MySQLはセットリターン関数をサポートしていますか? PostgreSQLの最近のリリースでは、最初の行にstart+1という値をgenerate_series(start, stop)関数があり、2番目にstart+1が続きます。 この機能は、 FROM句の副選択にこの関数を入れてから、テーブルを作成してデータを取り込み、le dorfierとBill Karwinの示唆どおりに結合するのではなく、その関数に結合することができるという利点があります。


SQLは、データベース内のデータ値のセットで作業するのには適していますが、データベースにないデータ値のセットではそれほど役に立ちません

最適な回避策は、範囲を指定する必要がある値に対して1つの小さなテーブルを保持することです。

CREATE TABLE ScoreValues (score int);
INSERT INTO ScoreValues (score) 
  VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

テストの最大マークを別のテーブルに定義するというコメントがある場合、 ScoreValuesが最大テストの最大マーク以上の値を持つことが確実である限り、そのテーブルに次の方法で結合できます。

SELECT v.score, COUNT(tr.score) AS 'NumStudents'
FROM ScoreValues v 
  JOIN Tests t ON (v.score <= t.maxmarks)
  LEFT OUTER JOIN TestResults tr ON (v.score = tr.score AND t.testid = tr.testid)
WHERE t.testid = 'mytestid'
GROUP BY v.score;

精神的な練習と同じように、私はMySQLでシーケンスを生成するためにこれを考え出しました。 四角形のすべてのデータベースのテーブルの数がシーケンスの全長より短い限り、それは動作します。 私は生産のためにそれをお勧めしません;)

SELECT @n:[email protected]n+1 as n from (select @n:=-1) x, Information_Schema.Tables y, Information_Schema.Tables WHERE @n<20; /* sequence from 0 to 20 inclusive */




group-by