2014-12-03 3 views
1

У меня есть 2 таблицы SQL. пользователей содержит пользователей и регистраторы содержит все записи, сделанные для мероприятия. Учитывая, что у меня есть идентификатор события - я успешно распечатываю тех пользователей, которые зарегистрированы для определенного события. Однако я хочу напечатать всех пользователей, которые НЕ зарегистрированы для события, и здесь я не могу создать правильный результат. Мой запрос выглядит следующим образом:SQL NOT query возвращает неверные результаты

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-код, хотя я уверен, что вся работа там правильная.

+2

вы должны использовать правильный синтаксис соединения, а затем это простое правое внешнее соединение. –

ответ

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 =„$ ид“»

+1

Работал! Большое спасибо! –

0

Вы пробовали «.... И регистрировались.pld <> users.uid"; ?

или

".... И registrants.pld = users.uid!";

+0

Те же результаты. Нет успеха: | –

+0

Вы могли бы разместить пару записей в обе таблицы, чтобы я мог лучше понять настройку? – tdh

0

Вы должны использовать анти -join, то есть внешнее соединение, в котором вы хотите вернуться из зависимой стороны значений объединения, где независимая сторона соединения равна нулю.

В вашем случае это выглядит следующим образом:

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 
+0

Спасибо за ваш ответ, но запрос возвратил 0 строк. Мне сложно понять это, и я обязательно углубится в концепции анти-объединения. Я обязательно заменил $ id на соответствующее значение, поэтому я предполагаю, что что-то еще не так. Ответ перед вашим работает правильно. –

+0

@KalinVarbanov Да, это была моя ошибка, часть 'AND registeristrants.tourId = '$ id'' должна была быть в разделе JOIN, а не в предложении WHERE запроса. –

1

Предполагая, что «registrants.pId» является внешним ключом к таблице «пользователей», этот запрос будет давать вам каждую комбинацию регистраций и пользователей, где регистрант и пользователь не связаны.

Как я вижу, вы можете достичь намеченного результата, чтобы выбрать пользователей, использующих подзапрос, чтобы исключить тех, кто зарегистрирован в событии. Что бы выглядело примерно так:

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

может быть более простой способ сделать это, хотя я не вижу его прямо сейчас.

+0

Правильно, к сожалению, на это уже ответил коллега. –

Смежные вопросы