我有一个查询要生成,但我似乎无法正确执行。我有三张 table :
学生
:学生详细信息
link
:学生存在的链接,链接的状态可以是事件或已完成
email
:显示通过电子邮件发送的链接。
我需要根据以下条件获取学生 ID 列表(从学生表中):
- link.status = 事件且相关的电子邮件不存在(即链接已创建,但尚未通过电子邮件发送)
- link.status 为 null,电子邮件为 null(即该学生没有现有链接)
- link.status = 已完成,并且该学生没有其他处于事件状态的链接
因此,如果我的表中有以下数据:
学生
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
链接
+----+-----------+------------+
| id | status | student_id |
+----+-----------+------------+
| 1 | completed | 1 |
| 2 | active | 1 |
| 3 | completed | 2 |
| 4 | active | 3 |
+----+-----------+------------+
电子邮件
+----+---------+
| id | link_id |
+----+---------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+---------+
那么我的查询应返回以下学生 ID:2,3,4
2 - 因为该学生只有一个完整的链接
3 - 因为存在没有关联电子邮件的事件链接
4 - 因为没有该学生的链接
我目前有这个查询,它可以获取我需要的部分内容:
SELECT DISTINCT student.id
FROM student
LEFT JOIN link ON link.student_id = student.id
LEFT JOIN email ON email.link_id = link.id
WHERE student.course = 'phd'
AND student.institution_id = '2'
AND (
(link.status != "active" AND email.id IS NULL)
OR
(link.status IS NULL AND email.id IS NULL)
OR
(link.status = "active" AND email.id IS NULL)
)
这当然不会获得任何 link.status = 已完成的学生 ID,并且该学生不存在其他链接。我当然可以通过添加来做到这一点:
(link.status = "completed" and email.id IS NOT NULL)
进入WHERE
,但是如果他们有另一个事件链接或没有事件链接,这将返回学生 ID。这是我正在努力解决的问题。
我感觉这可能无法通过单个查询来完成,所以我是否需要执行两个查询然后将它们相减? IE。上面的查询和一个单独的查询选择具有“已完成”状态的链接,然后从第一个查询中减去它们?
使用这些查询的应用程序是用 PHP 构建的,因此如果需要,我很乐意使用两个查询在 PHP 中执行一些逻辑。
(不知道该为标题添加什么内容,因此如果有人能想到更好的内容,请编辑它!)
最佳答案
SELECT s.*
FROM student s
LEFT
JOIN link l
ON l.student_id = s.id
AND l.status <> 'completed'
LEFT
JOIN email e
ON e.link_id = l.id
WHERE e.id IS NULL;
?
关于php - 困难的where子句,可能需要使用两个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24508236/