Выберите данные, если строка не существует

0

У меня есть несколько таблиц, которые объединены. Я пытаюсь выбрать только те, у которых не вставлена строка.

Пример 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?

  • 2
    Вы хотите левое соединение ... или правое соединение. Не уверен, что (именно поэтому я не публикую в поле «ответ» :)
  • 0
    выберите идентификатор вместо электронной почты в вашем подзапросе
Теги:

2 ответа

2
Лучший ответ

Похоже, вы выбираете электронную почту вместо 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)
  • 0
    Вы подтолкнули меня в правильном направлении. Я изменил подзапрос на: ВЫБЕРИТЕ ua.id КАК AccountID, и он, кажется, работает
  • 0
    Я рад, что помог.
1

Вам нужно использовать операцию 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 и имеете соединение в левой объединенной таблице, если оно больше не является левым соединением.

Вам также нужно изменить столбец подзапроса на идентификатор, так как это то, к чему вы его сравниваете.

  • 0
    Я запустил его, и я все еще возвращаю учетную запись пользователя, у которой его нет. Я бы очень хотел использовать левое решение для соединения :)
  • 1
    Итак, проблема была в неправильном столбце, впервые упомянутом в ответе @isaace. Не левый присоединиться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню