2014-01-23 68 views
0

幫助我有兩個表:我需要有點複雜的SQL查詢

students (name, test_code, grade) 
Tests (test_code, subject, part) 

有2個部分:a和b。

我想查詢所有通過部分a(超過50)但不是b部分(小於50)的學生的名字。

結果應該不會停這樣的:

John - chemistry part a 70 
       part b 23 

非常感謝,希望我理解......我是一個新手的sql ... 我覺得應該有一組由名稱,但再次它對我來說有點複雜... 所以任何幫助將不勝感激! 謝謝..

+3

不錯。你已經嘗試了什麼? –

+0

請顯示樣本輸入表數據。 – OldProgrammer

+1

你需要第三個表格,一個聯結表格,它建立學生和考試之間的多對多關係。 –

回答

0

你的表結構極不理想很多,但如果你必須使用你所擁有的,那麼這應該工作:

SELECT pass.name, pass.subject, pass.part, pass.grade, fail.part, fail.grade 
FROM 
(SELECT a.name, b.subject, b.part, a.grade 
FROM Students a 
INNER JOIN Tests b ON a.test_code = b.test_code AND b.part = 'a' AND a.grade > 50) pass 
INNER JOIN (SELECT a.name, b.subject, b.part, a.grade 
      FROM Students a 
      INNER JOIN Tests b ON a.test_code = b.test_code AND b.part = 'b' 
           AND a.grade < 50) fail on pass.name = fail.name 

否則,如果您有一定的靈活性,我建議此表的結構:

students (id, name) PRIMARY KEY (id) 
results (studentid, test_code, grade) PRIMARY KEY (student_id, test_code) 
Tests (test_code, subject, part) PRIMARY KEY (test_code) 

這給你一些好處,包括只有在你的學生表每一個學生1行,也有超過1名學生具有相同名稱的能力(該ID是唯一)

0

如果給定的這個表結構,那麼你可以選擇如下:

首先分別選擇學生和主題的不同組合,然後找出這個問題,並部分和B部分testcodes,然後找到牌號對於這個學生和這個測試代碼。

SELECT 
    student_subject.name, 
    student_subject.subject, 
    part_a.grade AS grade_a, 
    part_b.grade AS grade_b 
FROM ( 
    SELECT DISTINCT s.name, t.subject 
    FROM students s 
    JOIN tests t ON s.test_code = t.test_code) AS student_subject 
LEFT JOIN 
    tests testcode_a 
    ON testcode_a.part = 'a' 
    AND testcode_a.subject = student_subject.subject 
LEFT JOIN 
    tests testcode_b 
    ON testcode_b.part = 'b' 
    AND testcode_b.subject = student_subject.subject 
LEFT JOIN 
    students part_a 
    ON part_a.test_code = testcode_a.test_code 
LEFT JOIN 
    students part_b 
    ON part_b.test_code = testcode_b.test_code 
WHERE 
    part_a.grade >= 55 AND part_b.grade < 55 

SQLFiddle example

你會更好,如果你重新考慮表格模型和規範,雖然。