2012-05-02 33 views
0

に参加します私が持っている結果は次のとおりです:SQLマックスとダブルは、私は、次の3つのテーブルを持っている

SELECT stname 
    , subjname 
    , highestmark 
FROM (
      SELECT  MAX(results.percent) as "highestmark" 
        , student.stname 
        , subject.subjname 
      FROM  student 
        , subject 
        , results 
      WHERE  results.stnumb  = student.stnumb 
      AND   results.subjnumb = subject.subjnumb 
      GROUP BY stname 
     ) maxresult 

...と...

SELECT  student.stname as Student 
     , subject.subjname as Subject 
     , results.percent as Mark 
FROM  results 
JOIN  student 
ON   results.stnumb = student.stnumb 
JOIN  subject 
ON   results.subjnumb = subject.subjnumb 
ORDER BY stname 

誰かが正しい方向に私を指すしてくださいもらえますか?私は数日間それに取り組んできており、何の根拠も作っていません。

答えて

0

GROUP BYにsubjnameの欠落から判断すると、これはMySQLがあります。 MySqlには分析関数がないため、古い形式のトップ1を呼び出す必要があります。最大値を保持する派生テーブルを持つバージョンがあります。このテーブルは、元のテーブルをフィルタリングするために使用される:絆を返します

SELECT  student.stname as Student 
     , subject.subjname as Subject 
     , results.percent as Mark 
FROM  results 
JOIN  student 
ON   results.stnumb = student.stnumb 
JOIN  subject 
ON   results.subjnumb = subject.subjnumb 
WHERE  NOT EXISTS 
      (
       SELECT null 
        FROM results r2 
       WHERE r2.stnumb = results.stnumb 
        AND r2.percent > results.percent 
      ) 
ORDER BY stname 

どちらの方法:高いパーセントを持っていないだけで、学生のレコードを取得、またnot existsアプローチがあり

SELECT  student.stname as Student 
     , subject.subjname as Subject 
     , results.percent as Mark 
FROM  results 
JOIN  student 
ON   results.stnumb = student.stnumb 
JOIN  subject 
ON   results.subjnumb = subject.subjnumb 
JOIN 
(
    SELECT stnumb, MAX(percent) percent 
    FROM results 
    GROUP BY stnumb 
) top1GradePerStudent 
    ON results.stnumb = top1GradePerStudent.stnumb 
AND results.percent = top1GradePerStudent.percent 
ORDER BY stname 

。 1人の学生につき1レコードが必要な場合は、subjnameをMAXまたはMINで囲んでください。他のすべてのデータは同じですので、どの科目を選択するかは問題になりません。

P.S.私はこの質問をテストしなかった。タイプミスがあるかもしれませんが、基本的なアプローチは正しいです。

+0

メイト、あなたは伝説です!どうもありがとうございました!!!最初のクエリは完全に完全に機能します。助けてくれてありがとう。 –

0
SELECT pct, subjname, stname 
FROM 
(SELECT r.pct, sub.subjname, std.stname, 
RANK() OVER (PARTITION BY sub.subjname ORDER BY r.pct) as rk 
FROM student std 
INNER JOIN results r ON r.stnumb = std.stnumb 
INNER JOIN subject sub ON sub.subjnumb = r.subjnumb 
GROUP BY sub.subjname, std.stname, r.pct) a 
WHERE rk = 1 
+0

申し訳ありませんhkf、うまくいきませんでした。しかし、助けてくれてありがとう。 –

+1

「うまくいきませんでした」というのは非常に曖昧です。具体的には問題は何ですか?私はsqlfiddleでクエリをテストして実行します。あなたが提供したものを超えてデータ構造についての知識はありませんが、私は何が「うまくいくか」を前提にすることはできません。私が 'RANK()OVER(PARATION BY ..ORDER BY ..) 'で提案したアプローチは、あなたが概説した問題を解決するための正しいアプローチです。 – hkf

+0

私は知っている、それは漠然としていますが、私は何か理由がないのですが、間違ったクエリを入力したときに何も返されないので、問題はどこにでもある可能性があります。もし私がもっと知っていたら、私はそう言います。 –

関連する問題