web-dev-qa-db-ja.com

UNIONを使用して複数のテーブルから選択する

データベースを1つのユーザーテーブルから複数のユーザーテーブル(ロールごとに分割)に作り直しました:tblStudentstblTeacherstblAdmin

ログインするときに、ユーザーが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つのログインフォームがあり、複数のテーブルから選択して、ユーザーがデータベースに存在するかどうかを確認する必要があります。

8
cabaret

クエリを更新していただきありがとうございます。これで、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]"
12
El Yobo
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;
0
sajjad parmar