У меня есть несколько таблиц, которые объединены. Я пытаюсь выбрать только те, у которых не вставлена строка.
Пример 1. Я выбираю таких пользователей:
SELECT *
FROM user_accounts AS ua
INNER JOIN users AS u ON u.id = ua.user_id
INNER JOIN account_profile_entries AS ape ON ape.user_account_id = ua.id
INNER JOIN profile_entries AS pe ON pe.id = ape.profile_entry_id
WHERE pe.profile_field_id = 1227 AND pe.value_tinyint = 0;
В этом запросе у меня есть поле профиля, которое имеет 1227, а его значение равно 0. Все нормально.
Пример второй. Я также делаю аналогичный запрос, но на этот раз value_tinyint = 0:
SELECT *
FROM user_accounts AS ua
INNER JOIN users AS u ON u.id = ua.user_id
INNER JOIN account_profile_entries AS ape ON ape.user_account_id = ua.id
INNER JOIN profile_entries AS pe ON pe.id = ape.profile_entry_id
WHERE pe.profile_field_id = 1227 AND pe.value_tinyint = 1;
Все в порядке и в этом случае.
Где я застрял:
Я застрял, когда мне нужно выбрать user_accounts, когда нет записи (строки) в pe.profile_field_id = 1227 Это то, что я пробовал до сих пор:
SELECT *
FROM user_accounts AS ua
WHERE ua.id NOT IN (SELECT u.email AS UserEmail
FROM user_accounts AS ua
INNER JOIN users AS u ON u.id = ua.user_id
INNER JOIN account_profile_entries AS ape ON ape.user_account_id = ua.id
INNER JOIN profile_entries AS pe ON pe.id = ape.profile_entry_id
WHERE pe.profile_field_id = 1227)
Но этот запрос также возвращает тех пользователей, у которых есть запись 1227.
Как я могу изменить этот запрос, чтобы вернуть меня только тем пользователям, у которых нет записи в таблице profile_entries?
Похоже, вы выбираете электронную почту вместо id. Измените свой запрос на:
SELECT *
FROM user_accounts AS ua
WHERE ua.id NOT IN (SELECT u.id
FROM user_accounts AS ua
INNER JOIN users AS u ON u.id = ua.user_id
INNER JOIN account_profile_entries AS ape ON ape.user_account_id = ua.id
INNER JOIN profile_entries AS pe ON pe.id = ape.profile_entry_id
WHERE pe.profile_field_id = 1227)
Вам нужно использовать операцию LEFT JOIN для таблицы, которую вы не знаете, если строка существует:
SELECT *
FROM user_accounts AS ua
WHERE ua.id NOT IN
(SELECT u.id
FROM user_accounts AS ua
INNER JOIN users AS u ON u.id = ua.user_id
INNER JOIN account_profile_entries AS ape
ON ape.user_account_id = ua.id
LEFT JOIN profile_entries AS pe
ON pe.id = ape.profile_entry_id
AND pe.profile_field_id = 1227)
Обратите внимание, что я также переместил pe.profile_field_id = 1227
в раздел JOIN, потому что если вы используете операцию LEFT JOIN и имеете соединение в левой объединенной таблице, если оно больше не является левым соединением.
Вам также нужно изменить столбец подзапроса на идентификатор, так как это то, к чему вы его сравниваете.