2011-12-23 14 views
1

FIRST QUERYiはLEFT JOINをOR INNER JOINをまたはRIGHT SECOND QUERY

$sql="SELECT distinct(syllabus.syllabusName) as subjectName,$cid as courseId, stud.batchId as batchId,course.courseId,course.syllabusId AS subjectID,course.unitId,stud.studentID as studentID ,concat(stud.studentFirstName,' ',stud.studentLastName,' ',stud.studentRegistrationNumber) AS studentName 
      FROM studentdetails stud   
      INNER JOIN `coursemapping` course 
      ON stud.`courseId`=course.courseId 
      INNER JOIN syllabus syllabus 
      ON course.syllabusId=syllabus.syllabusId 
      WHERE course.courseId ='$cid' AND course.syllabusId='$sid' AND stud.`batchId`='$bid'"; 

単一のクエリに

 $sql=" SELECT A.assignmentId, A.unitId, B.assignmentName, C.assignmentsBatchId AS batchId, C.courseId AS courseId,C.assignmentMappingId, D.studentId, concat(E.studentFirstName, ' ', E.studentLastName, ' ', E.studentRegistrationNumber) AS studentName 
      FROM studentdetails E 
      INNER JOIN assignmentscompleted D ON E.studentId = D.studentId 
      INNER JOIN assignmentsbatch C ON D.assignmentId = C.assignmentMappingId 
      INNER JOIN assignments B ON D.assignmentId = B.assignmentId 
      INNER JOIN assignmentsMapping A ON B.assignmentId = A.assignmentId 
      WHERE A.assignmentId = '$sid' 
      AND C.assignmentsBatchId = '$bid' 
      AND C.courseId ='$cid'"; 

THIRD QUERY

$sql = "SELECT distinct(C.syllabusName) as subjectName,B.maxAccadamicMarks as marksScored,B.academicMarks as maxMarks,B.marksPercentage as percentage 
        FROM studentdetails A INNER JOIN marks B 
        ON A.studentId=B.studentId AND A.courseId=B.courseId AND A.batchId=B.batchId 
        INNER JOIN syllabus C 
        ON B.syllabusId=C.syllabusId WHERE A.studentUserName='$studentUserName'"; 

を3別のクエリを接合するためにJOINを使用すべきここでは、件名、学生、accmarks、マーク、パーセンテージを取得するために、3つのクエリにすべて参加する必要がありますか?この3つのクエリをすべて単一のクエリに結合する方法

+1

私は、関連するテーブルのいくつかが同じであっても、異なるタイプのデータをフェッチしているため、これらのクエリを単一のテーブルに結合することはできないと言います。 –

+0

だから解決策は何ですか – dude

+4

なぜこれらをすべて単一のクエリとして実行する必要がありますか?リンゴ、オレンジ、泥を取り出す場合は、それらをすべて泥風味の果物パイに焼く代わりに、別々に取り出します。 –

答えて

0

共通テーブルを使用しているため、クエリを簡単にまとめることができるようですが、テーブル構造は使用しません。またはあなたが提供した3つのクエリ。私は、これらのクエリのそれぞれが、あなたが必要としているものとまったく同じものを返すと仮定しています。

3番目のクエリを変更してstudentIDに追加するだけで、他のクエリと正しく結合でき、2番目のクエリで冗長な情報をコメントアウトできるようになりました。 はデカルトを取得せず作業が個々のクエリに参加するが、再びテーブル構造なしに必ずすることは困難であるべきだと

select 
    a.studentID as studentID, 
    a.studentName as studentName, 
    $cid as courseID, 
    a.batchID as batchID, 
    a.subjectID as subjectID, 
    c.subjectName as subjectName, 
    a.unitID as unitID, 
    b.assignmentID as assignmentID, 
    b.assignmentName as assignmentName, 
    b.assignmentMappingID as assignmentMappingID, 
    c.marksScored as marksScored, 
    c.maxMarks as maxMarks, 
    c.percentage as percentageMarks 
from 
(
    select 
     distinct(syllabus.syllabusName) as subjectName, 
     $cid as courseID, 
     stud.batchId as batchID, 
     course.courseID, 
     course.syllabusId as subjectID, 
     course.unitID, 
     stud.studentID as studentID , 
     concat(stud.studentFirstName,' ',stud.studentLastName,' ',stud.studentRegistrationNumber) AS studentName 
    FROM 
     studentdetails stud   
      INNER JOIN `coursemapping` course 
       ON stud.`courseId`=course.courseId 
      INNER JOIN syllabus syllabus 
       ON course.syllabusId=syllabus.syllabusId 
    WHERE 
     course.courseId ='$cid' 
     AND course.syllabusId='$sid' 
     AND stud.`batchId`='$bid' 
) a, 
(
    SELECT 
     A.assignmentID, 
     A.unitID, 
     B.assignmentName, 
     C.assignmentsBatchId AS batchID, 
     C.courseId AS courseID, 
     C.assignmentMappingID, 
     D.studentID, 
     --concat(E.studentFirstName, ' ', E.studentLastName, ' ', E.studentRegistrationNumber) AS studentName 
    FROM 
     studentdetails E 
      INNER JOIN assignmentscompleted D 
       ON E.studentId = D.studentId 
      INNER JOIN assignmentsbatch C 
       ON D.assignmentId = C.assignmentMappingId 
      INNER JOIN assignments B 
       ON D.assignmentId = B.assignmentId 
      INNER JOIN assignmentsMapping A 
       ON B.assignmentId = A.assignmentId 
    WHERE 
     A.assignmentId = '$sid' 
     AND C.assignmentsBatchId = '$bid' 
     AND C.courseId ='$cid' 
) b, 
(
    SELECT 
     distinct(C.syllabusName) as subjectName, 
     B.maxAccadamicMarks as marksScored, 
     B.academicMarks as maxMarks, 
     B.marksPercentage as percentage, 
     A.studentID, 
     a.courseID as courseID 
    FROM 
     studentdetails A 
      INNER JOIN marks B 
       ON A.studentId=B.studentId 
       AND A.courseId=B.courseId 
       AND A.batchId=B.batchId 
      INNER JOIN syllabus C 
       ON B.syllabusId=C.syllabusId 
    WHERE 
     A.studentUserName='$studentUserName' 
) c 
where 
    a.studentID=b.studentID 
    and a.studentID=c.studentID 
    and a.courseID=b.courseID 
    and a.courseID=c.courseID 

これらのことを言っても、私は上記のコメントに完全に同意しています。これらのすべてのクエリをマージすると、無駄な各行で何度も何度も何度も繰り返される情報を持つレコードセットが得られます。 1つのクエリを実行して値を変数にポップし、必要に応じて使用する方がよい場合もあります。