我有这张桌子:
+--------+---------+---------+
|subject | student | remark |
+--------+---------+---------+
| sub1 | stud1 | Pass |
+--------+---------+---------+
| sub2 | stud1 | Pass |
+--------+---------+---------+
主题sub1
和sub2
是其他主题的先决条件。我想从这两个先决条件中提取学生的评论,看看他是否有资格参加。
我目前有:
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
此查询不会产生任何结果。
答案 0 :(得分:1)
试试这个:
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
答案 1 :(得分:1)
这是因为在WHERE
条件下,您需要同时subj='sub1'
和subj='sub2'
,这是永远不可能的。
一种方法是使用sub
和mark
(enrolees
?)加入表格。这是因为学生必须传递 BOTH sub1和sub2(而不是传递至少一个,在这种情况下你可以使用and subj IN ('sub1','sub2')
:
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。
然而,这有点太糟糕了 - 如果您有5个先决条件,所有必要的,您必须在JOIN
中enrollees
5次。
你可以解决这个问题的一种方法是提高他们获得的通行证数量。然后你不必加入:
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
中的总数。连接数不会随先决条件数增加。
答案 2 :(得分: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
答案 3 :(得分:0)
subj = 'sub1' AND subj = 'sub2'
我的价值不可能是不同的东西。这永远不会成真。我想你的意思是
WHERE (remark = 'Pass' AND (subj = 'sub1' OR subj = 'sub2'))
答案 4 :(得分:0)
基本上你现在告诉数据库你想要返回一个主题是“sub1”和“sub2”的行,所以这就是它没有返回任何行的原因。
你必须这样做:
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
这将返回主题在IN()
列表中的所有行