SQL NOT查询返回错误的结果

时间:2014-12-03 18:35:27

标签: php mysql

我有2个SQL表。 用户包含用户,注册人包含为活动完成的所有注册。鉴于我有事件的ID - 我成功打印出为特定事件注册的用户。但是我想要打印所有未注册该事件的用户,这里我无法生成正确的结果。我的查询如下:

SELECT users.fName, users.lName, users.uid
FROM users, registrants
WHERE registrants.tourId = '$id' AND NOT registrants.pId = users.uid

结果是打印出33个用户的数组,虽然我只有12个,其中3个已经注册了该活动。是SELECT命令错了还是我需要深入研究php代码,虽然我很确定那里的所有工作都是正确的。

4 个答案:

答案 0 :(得分:4)

通过指定无JOIN语法,而是在WHERE子句中指定一种不等式连接,您实际上是在要求SQL查找用户和注册人的所有组合,并附加其他过滤条件WHERE子句,因此行数很多。

我相信您正在寻找的查询更像是这样:

SELECT users.fName, users.lName, users.uid
FROM users
WHERE users.uid NOT IN (
   SELECT registrants.pId 
   FROM registrants
   WHERE registrants.tourId = '$id');

"查找所有用户,但为tourId =' $ id'""

注册的用户除外

答案 1 :(得分:1)

假设“registrants.pId”是表“users”的外键,此请求将为您提供注册人和用户不相关的所有注册人和用户组合。

我看到您可以实现预期结果的方式是选择使用子查询的用户来排除那些被注册到该事件的用户。这看起来像是:

$query = "SELECT users.fName, users.lName, users.uid FROM users WHERE users.uid not in (SELECT users.uid FROM users, registrants WHERE registrants.tourId = '$id' AND registrants.pId = users.uid)"

可能有一种更简单的方法可以做到这一点,尽管我现在还没有看到它。

答案 2 :(得分:0)

你试过“.... AND registrants.pld<> users.uid”; ?

“.... AND registrants.pld!= users.uid”;

答案 3 :(得分:0)

您需要使用反连接,即您希望从连接值的从属端返回的外连接,其中连接的独立侧为空。

在你看来是这样的情况下:

SELECT users.fName, users.lName, users.uid
FROM users
LEFT OUTER JOIN registrants
ON users.uid = registrants.pId
AND registrants.tourId = '$id'
WHERE registrants.pId IS NULL