SELECT 2具有不同键的行具有相同数据的字段?

时间:2012-03-10 07:31:29

标签: mysql

我有这张桌子:

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

主题sub1sub2是其他主题的先决条件。我想从这两个先决条件中提取学生的评论,看看他是否有资格参加。

我目前有:

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

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

5 个答案:

答案 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',这是永远不可能的。

一种方法是使用submarkenrolees?)加入表格。这是因为学生必须传递 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个先决条件,所有必要的,您必须在JOINenrollees 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()

列表中的所有行