我有这张表:
+--------+---------+---------+
|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
此查询没有结果。
最佳答案
这是因为在您的 WHERE
条件下,您需要同时 subj='sub1'
AND 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
中的总数。连接数量不会随着先决条件数量的增加而增加。
关于mysql - SELECT 2 具有不同键的行具有相同数据的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9644751/