php - 困难的where子句,可能需要使用两个查询?

标签 php mysql sql

我有一个查询要生成,但我似乎无法正确执行。我有三张 table :

学生:学生详细信息

link:学生存在的链接,链接的状态可以是事件或已完成

email:显示通过电子邮件发送的链接。

我需要根据以下条件获取学生 ID 列表(从学生表中):

  1. link.status = 事件且相关的电子邮件不存在(即链接已创建,但尚未通过电子邮件发送)
  2. link.status 为 null,电子邮件为 null(即该学生没有现有链接)
  3. 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/

相关文章:

sql - 如何找出 SQL Server 中引用表的 FOREIGN KEY 约束?

php - 在 php 中使用 mvc 框架设计后端

php - 自动建议功能以搜索记录

mysql - 设置我自己的私有(private) Astonia 服务器

mysql - SQL 结果长度且搜索时不显示任何内容

不支持 ODBC 或 MSSQL 的 PHP 到 SQL Server

php - PHP 中的字符串相似度 : levenshtein like function for long strings

php - 从应用程序登录的最佳方式

mysql - SQL查询优化,如果第一个为空则按其他行排序

c# - 查找名称中包含奇数字符的记录