2016-04-26 53 views
0

我有返回以下結果(實施例)的查詢:選擇並使用相同的列作爲參數組結果

+----+-----------+------------+ 
| ID | FirstName | CourseName | 
+----+-----------+------------+ 
| 1 | Alice  | X   | 
| 2 | Bob  | X   | 
| 2 | Bob  | Y   | 
+----+-----------+------------+ 

查詢採用3個表(用戶,用戶課程和課程),和使用JOIN返回用戶的ID和他的名字,和所有課程,他是在所有的名字

我需要創建一個查詢返回誰在具體課程的用戶,例如:

  • 選擇所有用戶我n課程X:將返回Alice和Bob的細節。
  • 選擇課程的X和Y的所有用戶:將返回只有Bob,因爲愛麗絲是不是當然Y.

查詢X AND的結果Y爲:

+----+-----------+ 
| ID | FirstName | 
+----+-----------+ 
| 2 | Bob  | 
+----+-----------+ 
+0

將預期結果添加到您的問題。 – jarlh

+0

@jarlh加入:) –

回答

1

假設用戶表和課程表有一個ID和名稱列,以及用戶的課程只外鍵ID,您可以執行以下操作:

對於第一個問題:

select u.* from user u 
inner join user-courses uc on uc.user_id=u.id 
inner join course c on c.id=uc.course_id and c.name='X'; 

它過濾在內的用戶加入,並在THA最後部分(c.name =「X」)過濾過程中。你可以用其他方式過濾。

對於第二之一:

select * from user 
where id in (
    select distinct a.* from (
     select user_id from user-courses uc inner join course c 
     on c.id=uc.course_id 
     where c.name='X' 
    ) a 
    inner join (
     select user_id from user-courses uc inner join course c 
     on c.id=uc.course_id 
     where c.name='Y' 
    ) b 
    on a.user_id=b.user_id 
); 

MS-訪問沒有相交,所以就用內部聯接(一個之間和b),以獲得相同的結果。 A是來自課程'X'的用戶和來自'Y'的b的表格。內部連接相交,導致兩個課程中的用戶。然後我使用ID來過濾。

我沒有MS-訪問,所以我在PostgreSQL的嘗試,但我用SQL-ANSI,所以我希望如此。

+0

謝謝!嘗試過我的數據庫,它運行得很好 –

+0

太棒了!樂於幫助! –