2016-11-13 2 views
0

誰かが私が正しく何をしていないのか教えてください。ここでは実行したいクエリですが、コマンドを実行すると何も起こりません。私はSQLに慣れているので、もしあれば、間違いを赦してください。結合でSQLサブクエリを実行できない

SELECT t.*, 
COUNT(DISTINCT t.subjects) AS subjectenrollment, 
u.urefnumber, 
u.uresidence 
FROM 
(
    SELECT r.*, 
    @curRank := IF(@prevRank = finalscore, @curRank, @incRank) AS position, 
    @incRank := @incRank + 1, 
    @prevRank = finalscore 
    FROM studentsreports r, 
    (
    SELECT @curRank := 0, 
    @prevRank = NULL, 
    @incRank := 1 
) c 
    ORDER BY finalscore ASC 
) t LEFT JOIN studentstbl u ON t.studref = u.urefnumber 
WHERE t.author = :staff 
AND t.studentname = :student 
AND t.academicyr = :year 
AND t.academicterm = :term 
AND t.program = :program 
AND t.classes = :level 
AND t.subjects = :subject; 

それがコードからわかるように、私は学生のレコードをフェッチしようとすると、各被験者における位置のための列だけでなく、各教科を提供する学生の数が含まれています。さらに、私はそれぞれの学生の居住地を別のテーブルにも含めたいと思います。

ある時点で、累積生スコア、つまり各被験者で得られたすべてのマークの合計を追加したいと思っていますが、それを可能にする方法もわかりません。友人は既に別のクエリでそれを達成することを示唆していますが、残念ながら、私はそれを得ることができます。 ご協力いただき、誠にありがとうございます。前もって感謝します!

+1

(バインドさのparams付き)、あなたは真剣ですMySQLが非標準的な 'GROUP BY'の実装を誤ってしまいます。 'COUNT()'は集約関数です。これを読む。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.htmlまた、すべての '@ランク'のものを使い始める前に、情報の一部を正しく取得するようにしてください。トリッキーで非標準です。 MySQLの宣言型モデルの上に手続き型モデルを強制して、奇妙な方法で実行します。 –

+0

コロンプレフィックス付きのバインドされたパラメータがあるので、PHPなどのコードでこのクエリを実行していますか?これらのパラメータのいずれかの値がともに結果を返さないか、またはクエリがキャッチしていないエラー/例外をスローします。 – Parfait

答えて

0

@variablesを必要とせずに、派生テーブルと相関サブクエリを使用して調整することを検討してください。一緒にリストされて採用さstategyとニーズを次のハンドル以下のSQL文:

  1. 各被験者における位置/ランクの列 - 集計相関カウントサブクエリトップレベルで
  2. 各被験者を提供する学生の数 - 集計カウント派生表(内部JOIN句を)
  3. 各学生の在留資格 - フィールドでグループ(From句)各被験者におけるすべてのマークの
  4. 総和 - 合計額派生表

(FROM句)SQLあなたのトップレベルのクエリでCOUNT() ``のご利用には

SELECT main.student_number, main.subjects, main.student_residence, 
     main.accum_raw_scores, 
     (SELECT COUNT(*) 
     FROM (SELECT s.studref, s.subjects, SUM(s.finalscore) AS total_score 
       FROM studentsreports s 
       GROUP BY s.studref, s.subjects) AS sub 
     WHERE sub.subjects = main.subjects 
     AND sub.total_score >= main.accum_raw_scores) AS subject_rank, 
     cnt.subject_student_count 
FROM 
    (SELECT r.studref AS student_number, r.subjects, u.uresidence AS student_residence, 
      SUM(r.finalscore) AS accum_raw_scores  
    FROM studentreports r 
    LEFT JOIN studentstbl u ON r.studref = u.urefnumber 
    WHERE r.author = :staff 
    AND r.studentname = :student 
    AND r.academicyr = :year 
    AND r.academicterm = :term 
    AND r.program = :program 
    AND r.classes = :level 
    AND r.subjects = :subject 
    GROUP BY r.studref, r.subjects, u.uresidence) main 
INNER JOIN 
    (SELECT sub.subjects, COUNT(*) AS subject_student_count 
    FROM studentreports sub 
    GROUP BY sub.subjects) cnt 
ON cnt.subjects = main.subjects 
+0

@Paefaitこのような素晴らしいサポートに感謝します。事実、私はこの完璧な解決策にいかに感謝しているかを言葉で説明することができないので、私があなたにどれほどの感謝を示すことができるかはわかりません。あなたは私にbeyoundの期待を救った。私は、運が最高のものを提供してくれることを願っています。本当にありがとう。ソリューションは正確で、実際には完璧なものでした。 5つ星が必要です。 –

+0

うわー!!!データがなければ、私は暗闇の中で撮影していました。 SQLが正しかったのはうれしいです。それはまだ最高の返信を持っているかもしれません。お役に立てて嬉しいです。ハッピーコーディング! – Parfait

+0

@パエファット私はあなたに敬意を表します!私は、さまざまな科目からの累積したマークを使って、すべての生徒の全体的な職位またはランクを追加するというこの課題を抱えています。あなたは私を助けてくれますか?あなたが私を助けてくれた上記の質問に関して、私を助けてください。 –

関連する問題