从表中选择所有其他查询不返回任何结果

时间:2015-06-20 14:39:03

标签: php mysql

我正在为某人创建一个注册网络应用程序,我想让学生搜索将学生添加到活动注册表中稍微准确一些。

目前,我准备好的陈述是:

("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)

3 个答案:

答案 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

小心一些事情:

  • 请勿使用LIKE来匹配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']

的占位符