gpt4 book ai didi

php - 从表中选择所有其他查询未返回结果的表

转载 作者:行者123 更新时间:2023-11-29 02:55:36 24 4
gpt4 key购买 nike

我正在为某人创建一个注册 Web 应用程序,我想让学生搜索将学生添加到事件注册中稍微更准确一些。

目前我准备好的声明是:

("SELECT * FROM students WHERE first_name LIKE :pattern OR last_name LIKE :pattern OR id LIKE :pattern ORDER BY last_name ASC");

而且效果很好。我返回与搜索查询匹配的所有学生的列表。然而,在执行该查询之后,对于返回的每一行,我想检查 students.id 和 $_GET['activity'] 是否已经出现在参与者表中。

$_GET['activity'] 是来自 activities.id 的 ID

我想要的最终结果是显示所有尚未注册该事件的学生。

这可以在一个查询中实现吗?就好像我宁愿这样做然后必须对每个返回结果运行查询以查看它是否应该显示。

我已经研究过 INNER JOIN,因为我以前用过它,但我觉得这不是我需要的。我的主要问题是如何运行该查询以检查每个结果是否已经在参与者表中。

希望这会有意义,因为我发现很难想出如何在脑海中表达它。

我的表结构:

学生 - id PRIMARY KEY AI, first_name (varchar255), last_name (varchar255), dob (date)

事件 - id PRIMARY KEY AI,标题 (varchar255),描述 (varchar255)

参与者 - id PRIMARY KEY AI, student_id (INT), activity_id (INT)

最佳答案

编辑更新此以使用问题中的三个表

如果您想要所有没有进行特定事件的学生,您可以使用这样的查询模式。 LEFT JOIN 保留了 students 表中的所有记录,并将 NULL 值放在 activities 的列中,其中ON 条件 无法匹配。 然后您输入 WHERE 条件以仅保留那些 NULL 值。像这样:

 SELECT s.id, s.first_name, s.last_name
FROM students s
LEFT JOIN participants p ON s.id = p.student_id
LEFT JOIN activities a ON p.activity_id = a.activity_id AND a.activity LIKE :act
WHERE a.activity_id IS NULL
AND ( s.first_name LIKE :a OR s.last_name LIKE :b OR etc etc )

如果您输入的是 activity_id,那就更简单了。

 SELECT s.id, s.first_name, s.last_name
FROM students s
LEFT JOIN participants p ON s.id = p.student_id AND p.activity_id = :act
WHERE p.activity_id IS NULL
AND ( s.first_name LIKE :a OR s.last_name LIKE :b OR etc etc )

正如您所注意到的,INNER JOIN 无法执行此操作,因为它从第一个表中删除了与 ON 条件不匹配的行。但这些行正是您想要的行,因此 LEFT JOIN ... WHERE ... IS NULL

注意一些事情:

  • 不要使用 LIKE 来匹配 id 值。
  • 不要使用SELECT *。相反,在结果集中命名您想要的列。
  • student 表过滤器中的 OR ... LIKE 子句序列不会很好地执行。

关于php - 从表中选择所有其他查询未返回结果的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30955166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com