#mysql #select #union
#mysql #выберите #объединение
Вопрос:
Я переработал свою базу данных с одной пользовательской таблицы на несколько пользовательских таблиц (разделенных на роли): tblStudents
, tblTeachers
, tblAdmin
При входе в систему я не хотел запускать три запроса, чтобы проверить, существует ли пользователь где-то в моей базе данных. Итак, что я сделал, это составил следующий запрос с union
select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s
union
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a
union
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t
При этом выбираются поля, которые одинаковы во всех таблицах, и для меня выводятся приятные результаты.
Итак, я решил попробовать это, и по какой-то причине моя форма входа в систему не работала. Для моей формы входа в систему я добавил where
предложение, которое проверяет наличие адреса электронной почты. Я запустил запрос в своем приложении базы данных и, что удивительно, когда я делаю, например, where email = "admin@admin.be"
(это электронное письмо существует в моей базе данных tblAdmin
), оно также выбирает запись из моей таблицы students.
С помощью предложения where:
select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s
union
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a
union
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t
where email = "admin@admin.be"
Обе записи have id = 1
но я не понимаю, почему при фильтрации по адресу электронной почты администратора выбирается запись student. Почему это? Может кто-нибудь объяснить и предоставить мне лучшее решение этой проблемы? У меня в основном одна форма входа, и мне нужно выбрать в нескольких таблицах, чтобы проверить, существует ли пользователь в моей базе данных.
Комментарии:
1. Похоже, что это не ваш полный запрос, поскольку в нем нет фильтрации. Можете ли вы опубликовать весь запрос?
2. Думал, что это будет понятно; обновлено другим запросом 🙂
3. Я заметил, что вы не заключаете строку в кавычки. Это ошибка?
4. Если вы имеете в виду email = one, да, я забыл его там; отредактировано.
5. По смежной теме; старайтесь избегать использования «» для цитирования ваших строк. MySQL, к сожалению, допускает это, но если вам когда-нибудь придется перейти на другую базу данных, она выбросит вам пустышку. Использование » вместо» является стандартом SQL и будет работать с MySQL и всем остальным.
Ответ №1:
Спасибо за обновление запроса; теперь мы можем видеть, что условие WHERE применяется только к последнему объединенному запросу. Вам нужно либо добавить это предложение WHERE к каждому запросу, либо обернуть его как подвыборку и применить к нему предложение WHERE.
select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s
where email = "admin@admin.be"
union
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a
where email = "admin@admin.be"
union
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t
where email = "admin@admin.be"
или
SELECT * FROM (
select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s
union
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a
union
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t
) foo where email = "admin@admin.be"
Комментарии:
1. Во втором примере я получаю следующую ошибку: «Каждая производная таблица должна иметь свой собственный псевдоним».
2. Что именно делает этот ‘foo’? Это то же самое, что я делаю с
tblAdmin a
? Спасибо за ваше время!3. Это псевдоним для подвыборки; он просто присваивает ему имя, на которое вы можете ссылаться, например, когда вы делаете «выбрать s.id как идентификатор». Это позволило бы вам выбрать только определенные поля из подвыборки, сказав
select foo.email FROM (...) foo
. Если это делает его более понятным, вы можете (в большинстве СУБД) сказать «КАК foo» вместо просто «foo». Само имя произвольно; называйте его как хотите, я просто использую foo по умолчанию 🙂4. Хорошо, теперь это имеет смысл. Я назвал это «пользователи» для наглядности. Большое спасибо!
5. Вернул ли запрос то, что вы хотели после изменения?
Ответ №2:
SELECT
R.co_C,
company3.Statuss
FROM
(
SELECT
company1.co_C
FROM
company1
UNION ALL
SELECT
company2.co_C
FROM
company2
) AS R
LEFT JOIN company3 ON R.co_C = company3.co_A;