Mysql 选择具有相同数据的a字段的具有不同键的两行?

Mysql 选择具有相同数据的a字段的具有不同键的两行?,mysql,Mysql,我有这张桌子: +--------+---------+---------+ |subject | student | remark | +--------+---------+---------+ | sub1 | stud1 | Pass | +--------+---------+---------+ | sub2 | stud1 | Pass | +--------+---------+---------+ sub1和sub2科目是另一科目的先决条件。我想

我有这张桌子:

+--------+---------+---------+
|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

此查询不会产生任何结果。

您当前的查询不会产生任何结果,因为您正在查找在同一行的“主题”字段中同时包含“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
我不能对不同的事情有不同的看法。这永远不会是真的。我想你是说

WHERE (remark = 'Pass' AND (subj = 'sub1' OR subj = 'sub2'))
试试这个:

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

基本上,您当前告诉db您想要返回一行,其中subject同时是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
这将返回subject位于中列表中的所有行,因为在where条件下,您需要同时使用sub='sub1'和sub='sub2',这是不可能的

一种方法是使用sub和mark enrolees?连接表?。这是因为学生必须同时通过sub1和sub2,而不是至少通过一个,在这种情况下,您可以在“sub1”和“sub2”中使用和Sub:

这样可以确保学生通过sub1和sub2

然而,这有点糟糕-如果你有5个先决条件,所有必要条件,你必须加入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,因为他们必须通过所有科目

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中列出它们,并在HAVING中更改总数。联接的数量不会随着先决条件的数量而增加。

中的行为类似于或。我的数据库中只有两名学生在这两个科目上都“通过”。当我在中使用时,它会显示在任一科目中“通过”的所有学生。我需要的东西会表现得像和。在行为上像或。我的数据库中只有两名学生在这两个科目上都“通过”。当我在中使用时,它会显示在任一科目中“通过”的所有学生。我需要一个类似的东西,该查询将显示任何学生在任何一个科目上都有have remark='Pass'。我只需要显示两个科目都通过的学生。该查询将显示任何一个科目都有have remark='Pass'的学生。我只需要显示两个科目都通过的人。相应地更改了我的答案。。!!这正是我想做的,这就是为什么我一直使用和。别烦我。谢谢你,先生。你的回答是正确的。非常感谢。
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