2012-03-10 24 views
0

私はこのテーブルを持っている:SELECT 2フィールドが同じデータを持つ異なるキーを持つ行?

+--------+---------+---------+ 
|subject | student | remark | 
+--------+---------+---------+ 
| sub1 | stud1 | Pass | 
+--------+---------+---------+ 
| sub2 | stud1 | Pass | 
+--------+---------+---------+ 

科目sub1sub2は、別の対象への前提条件です。私は彼が入学資格を持っているかどうかを確認するために、これらの2つの前提条件から学生の発言を抽出したい。

私は現在持っている:

SELECT enrollees.student, students_db.lastname, students_db.firstname FROM enrollees, students_db WHERE 
(remark = 'Pass' AND subj = 'sub1' AND subj = 'sub2') 
AND enrollees.student = students_db.student_id 

このクエリは、何の結果が得られません。

答えて

1

を返します、それは決して可能ではありません。

これを行う1つの方法は、submarkenrolees?)の表を結合することです。

SELECT e1.student, sdb.lastname, sdb.firstname 
FROM students_db sdb 
JOIN enrollees e1 ON e1.student=sdb.student_id 
JOIN enrollees e2 ON e2.student=sdb.student_id 
WHERE 
e1.sub = 'sub1' AND e1.remark = 'Pass' 
AND 
e2.sub = 'sub2' AND e2.remark = 'Pass' 

これは、学生が SUB1、SUB2の両方に合格することを保証します:生徒は(あなたがand subj IN ('sub1','sub2')を使用することができ、その場合、少なくとも一つを、渡すこととは対照的に、 SUB1、SUB2の両方を通過しなければならないためです。

しかし、それは少し嫌だ - あなたはすべての必要な5つの前提条件を、持っている場合、あなたは​​5倍にJOINに持っているあなたはこれを回避することができます

一つの方法は、PASの数を合計することです。彼らは持っています。次に、あなたが参加する必要がありません。

SELECT e.student, sdb.lastname, sdb.firstname, 
FROM students_db sdb 
JOIN enrollees e ON e.student=sdb.student_id 
WHERE e.remark='Pass' AND e.sub IN ('sub1','sub2') -- list of subjects here 
GROUP BY e.student 
HAVING SUM(IF(e.remark='Pass',1,0))=2 -- number of subjects in the list here 

これは、学生が合格したどのように多くの必要な科目の(この場合は、「SUB1」と「SUB2」)カウントアップし、それがあることを確認します2に等しい(すべての対象を通過しなければならないため)。

これは、あなたがは(すべてが必要な前提条件で提供される)したいとなど多くの前提条件の被験者に入れることができるという利点を持っている - あなただけWHEREでそれらをリストしHAVINGで合計を変更する必要があります。ジョイン数は、前提条件の数とともに増加しません。

+0

それは私がそれをやろうとしていることです。 * Noob Me *。ありがとうございます。あなたの反応は正しいものでした。ありがとうございました。 – Nath

0

同じ行の件名フィールドに 'sub1'と 'sub2'の両方を持つ行を探しているため、現在のクエリでは結果が得られませんが、これはもちろん不可能です。 IN演算子を使用して、指定されたサブジェクトを持つ行を検索できます。

SELECT enrollees.student, students_db.lastname, students_db.firstname 
FROM enrollees, students_db 
WHERE (remark = 'Pass' AND subj in ('sub1','sub2') 
     AND enrollees.student = students_db.student_id 
+0

IN()はORのように動作します。私のデータベースには、両方の科目に「合格」がある2人の生徒しかいません。 IN()を使うと、いずれかの科目に「合格」があるすべての生徒が表示されます。私はANDのように行動するものが必要です。 – Nath

0
subj = 'sub1' AND subj = 'sub2' 

I値は異なるものにすることはできません。これは決して真実ではありません。

SELECT enrollees.student, students_db.lastname, students_db.firstname 
FROM (
    SELECT enrollees.student, students_db.lastname, students_db.firstname 
    FROM enrollees,students_db 
    WHERE enrollees.student = students_db.student_id 
    AND ((remark = 'Pass' AND subj = 'sub1') OR (remark = 'Pass' AND subj = 'sub2')) 
    GROUP by enrollees.student, students_db.lastname, students_db.firstname) 
    as foo 
GROUP by enrollees.student, students_db.lastname, students_db.firstname 
HAVING count(*) = 2 
+0

この問合せでは、どちらの科目にも発言=「合格」がある生徒が表示されます。私は両方の科目を渡す人だけを表示する必要があります。 – Nath

1

を意味だと思います行を返さない理由です。

あなたがしなければならない。

SELECT enrollees.student, students_db.lastname, students_db.firstname 
FROM enrollees, students_db 
WHERE remark = 'Pass' AND subj IN ('sub1', 'sub2') AND enrollees.student = students_db.student_id 

これはあなたのWHERE状態で使用すると、同時にsubj='sub1'subj='sub2'を希望しているためです対象は、IN(内のリストの中ですべての行)

+0

その質問は、いずれかの科目に発言=「合格」がある生徒を表示します。私は両方の科目を渡す人だけを表示する必要があります。 – Nath

+0

が私の答えに応じて変わりました!! –

0

基本的にあなたが現在あなたがあなたの件名は「SUB1」と「SUB2」の両方である行を返したいデシベルを伝えるので、これがある:私はあなたがこれを試してみてください

WHERE (remark = 'Pass' AND (subj = 'sub1' OR subj = 'sub2')) 
+0

IN()はORのように機能します。私のデータベースには、両方の科目に「合格」がある2人の生徒しかいません。 IN()を使うと、いずれかの科目に「合格」があるすべての生徒が表示されます。私はANDのように行動するものが必要です – Nath

関連する問題