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

标签 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

此查询没有结果。

最佳答案

这是因为在您的 WHERE 条件下,您需要同时 subj='sub1' AND subj='sub2' ,而这永远不可能有可能。

一种方法是使用 submark 连接表(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/

相关文章:

mysql - SQL,根据外键选择多个值,返回值

c# - 在 MySQL 中获取多个 LastInserted ID?

c++ - 使用 libmysql 插入特殊字符

mysql - 通过类对象 Visual Basic 2010 连接到数据库

mysql - 为什么十进制字段在 where 子句中接受字母?

jquery - Ignited-Datatables,应该怎么做?

mysql - 获取 varchar 字段的最大记录

php - MySQL 没有及时更新以回显更新的记录

PHP注册页面

php - Laravel 查询生成器计数