我正在为某人创建一个注册网络应用程序,我想让学生搜索将学生添加到活动注册表中稍微准确一些。
目前,我准备好的陈述是:
("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,title(varchar255),description(varchar255)
参与者 - id PRIMARY KEY AI,student_id(INT),activity_id(INT)
答案 0 :(得分:1)
编辑更新此项以使用问题中的三个表
如果您想要所有没有某项活动的学生,请使用这样的查询模式。 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
。
小心一些事情:
id
值。SELECT *
。而是在结果集中命名所需的列。OR ... LIKE
子句序列不会很好。答案 1 :(得分:0)
尝试此查询
"SELECT * FROM students WHERE first_name LIKE :pattern OR last_name LIKE :pattern OR id LIKE :pattern AND id NOT IN (select student_id From participants WHERE activity_id = activity)
此处'活动'是 $ _ GET ['活动'] 。
答案 2 :(得分:0)
您可以使用子查询来获取为studentid
注册的$_GET['activity']
,然后使用NOT IN
条件中的WHERE
将其从返回的行中删除。
SELECT * FROM students
WHERE
(first_name LIKE :pattern OR last_name LIKE :pattern OR id LIKE :pattern)
AND
id NOT IN
(SELECT student_id FROM participants WHERE activity_id = :activity)
ORDER BY last_name ASC
其中:activity
是$_GET['activity']