データベースを1つのユーザーテーブルから複数のユーザーテーブル(ロールごとに分割)に作り直しました:tblStudents
、tblTeachers
、tblAdmin
ログインするときに、ユーザーがDBのどこかに存在するかどうかを確認するために、3つのクエリを実行したくありませんでした。だから私がしたことは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 = "[email protected]"
(このメールは私のデータベースtblAdmin
にあります)、生徒のテーブルからレコードも選択します。
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 = "[email protected]"
両方のレコードhave id = 1
しかし、管理者の電子メールアドレスでフィルタリングしているときに、なぜ学生レコードが選択されるのかわかりません。どうしてこれなの?誰かがこの問題のより良い解決策を説明して私に提供できますか?基本的に1つのログインフォームがあり、複数のテーブルから選択して、ユーザーがデータベースに存在するかどうかを確認する必要があります。
クエリを更新していただきありがとうございます。これで、WHERE条件がlast UNIONedクエリにのみ適用されることがわかります。 どちらかそのWHERE句を各クエリに追加するか、副選択としてラップしてWHERE句を適用する必要があります。
select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s
where email = "[email protected]"
union
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a
where email = "[email protected]"
union
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t
where email = "[email protected]"
または
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 = "[email protected]"
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;