Функциональность запроса UNION и структура запроса - PullRequest
0 голосов
/ 10 ноября 2018

То, чего я пытаюсь добиться - это вставить значения в таблицу, если это значение не существует в 2 дополнительных таблицах.

INSERT INTO visitor(
  visitor_username,
  email,
  PASSWORD
)
SELECT * FROM
(
SELECT
    'admin2000',
    'adminemail@mail.com',
    '123456'
) AS tmp
WHERE NOT EXISTS
(
SELECT
    admin.admin_username,
    admin.email
FROM
    admin AS admin
WHERE
    admin.admin_username = 'admin2000' AND admin.email = 
'adminemail@mail.com'
UNION
SELECT
staff.staff_username,
staff.email
FROM
staff AS staff
WHERE
staff.staff_username = 'admin2000' AND staff.email = 
'adminemail@mail.com'
 )
LIMIT 1

В части ГДЕ НЕ СУЩЕСТВУЕТ, когда я только запрашиваю * _username (пример: admin_username или staff_username), она работает хорошо, но когда мне нужно проверить, существует ли электронная почта, она не работает должным образом.

Использую ли я, ГДЕ НЕ СУЩЕСТВУЕТ должным образом? если в таблице «admin» существует имя пользователя «admin2000» и адрес электронной почты «adminemail@mail.com», и я пытаюсь вставить его в таблицу «посетитель», он вставляет его, и этого делать не следует.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Проблема в AND в подзапросах. Он ищет строки, которые имеют это имя пользователя и этот адрес электронной почты. Поэтому, если у вас есть администратор с именем admin2000, но с другим адресом электронной почты, этот запрос не будет возвращен подзапросом, и поэтому будет добавлена ​​новая строка.

Используйте OR вместо AND, и проблема будет решена.

0 голосов
/ 10 ноября 2018

Вы, кажется, хотите написать запрос, подобный этому:

INSERT INTO visitor (visitor_username, email, PASSWORD)
    SELECT t.*
    FROM (SELECT 'admin2000' as visitor_username, 'adminemail@mail.com' as email, '123456' as PASSWORD
         ) t
    WHERE NOT EXISTS (SELECT 1
                      FROM admin a
                      WHERE a.visitor_username = t.visitor_username AND a.email = t.email
                     )
    UNION 
    SELECT s.staff_username, s.email, ? as password
    FROM staff s
    WHERE s.staff_username = 'admin2000' AND s.email = 
'adminemail@mail.com';

Обратите внимание, что во втором подзапросе отсутствует пароль, поэтому есть ошибка.

Это выглядит более кратко, используя один запрос:

INSERT INTO visitor (visitor_username, email, PASSWORD)
    SELECT t.*
    FROM (SELECT 'admin2000' as visitor_username, 'adminemail@mail.com' as email, '123456' as PASSWORD
         ) t
    WHERE NOT EXISTS (SELECT 1
                      FROM admin a
                      WHERE a.admin_username = t.visitor_username AND a.email = t.email
                     ) AND
          NOT EXISTS (SELECT 1
                      FROM staff s
                      WHERE s.staff_username = t.visitor_username AND s.email = t.email
                     );
...