Как мне исключить или опровергнуть два запроса? - PullRequest
2 голосов
/ 26 марта 2011

Я новичок в SQL, так что это, вероятно, очень просто, однако я не смог найти решение.

В основном мой запрос выглядит следующим образом:

SELECT UserID
FROM Users

NOT UNION

SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'

Однако я не уверен, каков синтаксис исключения одного запроса из другого. То, что я пытаюсь сказать, это дать мне все идентификаторы пользователя , за исключением для тех, которые находятся в группе X.

Ответы [ 5 ]

4 голосов
/ 26 марта 2011
SELECT UserID FROM Users
  WHERE UserID NOT IN (SELECT UserID FROM User_Groups WHERE GroupID = ?)

P.S. Не вставляйте переменные в ваши запросы, так как это может привести к уязвимости SQL-инъекций в вашем коде. Вместо этого используйте заполнители.

2 голосов
/ 26 марта 2011

Вы также можете использовать EXCEPT:

SELECT UserID
FROM Users
    EXCEPT
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'

EXCEPT - версия вычитания множества для SQL. Какой из различных подходов (EXCEPT, NOT IN, ...) вы должны использовать, как обычно, зависит от ваших конкретных обстоятельств, того, что поддерживает ваша база данных, и какой из них лучше всего подходит для вас.

И Евгений у уже упомянул проблему с SQL-инъекцией в вашем коде, так что я просто рассмотрю ее.

Я ссылался на документацию PostgreSQL, хотя это не вопрос PostgreSQL, потому что документация PostgreSQL довольно хорошая. SQLite поддерживает EXCEPT:

Оператор EXCEPT возвращает подмножество строк, возвращаемых левым SELECT, которые также не возвращаются правым SELECT. Повторяющиеся строки удаляются из результатов операторов INTERSECT и EXCEPT до возврата набора результатов.

2 голосов
/ 26 марта 2011
SELECT Users.UserID
FROM Users
LEFT JOIN User_Groups ON Users.UserID = User_Groups.UserID
WHERE Users.GroupID = '$_[0]'
AND User_Groups.UserID IS NULL

Вы можете оставить соединение с другой таблицей, а затем поставить проверку IS NULL на другую таблицу в предложении WHERE, как я показал.

1 голос
/ 26 марта 2011

NOT IN () - Отрицание IN ()

SELECT UserID FROM User_Groups WHERE GroupID NOT IN('1','2')

Параметр IN () также может быть подзапросом.

0 голосов
/ 26 марта 2011

Вы ищете решение для использования с базой данных postgres или mySQL? Или вы ищете простое решение SQL?

С postgres подзапрос с «ГДЕ НЕ СУЩЕСТВУЕТ» может работать так:

ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ SCHEMA_NAME.TABLE_NAME) ГДЕ (НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ОТ SCHEMA_NAME.TABLE_NAME)

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