2011-05-20 67 views
7

我返工從一個用戶表我的數據庫,多個用戶表(每個角色分):tblStudentstblTeacherstblAdmin選擇跨多個表與UNION

登錄時,我不想跑三個查詢檢查用戶是否存在於我的數據庫中的某個地方。所以我所做的就是放在一起以下查詢與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

這並不似乎是完整的查詢,因爲在它裏面沒有過濾。你能發佈整個查詢嗎? – 2011-05-20 00:11:46

+0

認爲這將是明確的;更新與其他查詢:) – cabaret 2011-05-20 00:13:28

+0

我注意到你沒有把字符串放在引號中。這是一個錯誤嗎? – roberttdev 2011-05-20 00:13:51

回答

10

感謝您更新查詢;現在我們可以看到WHERE條件僅適用於最後的 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]" 
+0

非常感謝。我會去嘗試一下:D – cabaret 2011-05-20 00:18:08

+0

第二個例子,我得到以下錯誤:'每個派生表必須有它自己的別名'。 – cabaret 2011-05-20 00:18:58

+0

對不起,添加了別名。 – 2011-05-20 00:19:40

0
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; 
+1

不要只給出代碼答案。 – 2015-11-30 12:00:27