2013-03-26 123 views
1

我第一次使用。選擇內部連接表ID vb

SELECT classroom .cls_id, 
    classroom.cls_name, 
    u1.users_id as users_id1, 
    u2.users_id as users_id2 
FROM classroom 
    INNER JOIN clsown 
      ON clsown.cls_id = classroom .cls_id 
    INNER JOIN users AS u1 
      ON clsown.users_id = u1.users_id 
    INNER JOIN users AS u2 
      ON clsown.users_id = u2.users_id 

我得到這個:

cls_id cls_name users_id1 users_id2 

1 -------- room1 ------- 1 --------- 1 
1 -------- room1 ------- 2 --------- 2 
2 -------- room2 ------- 3 --------- 3 
2 -------- room2 ------- 4 --------- 4 

我希望看到

cls_id cls_name users_id1 users_id2 

1 -------- room1 ------- 1 --------- 2 
2 -------- room2 ------- 3 --------- 4 

我不知道該怎麼辦內連接。我究竟做錯了什麼?

感謝您的回答。

+0

哪裏都是2'users_id'來自哪裏?你的查詢限制了在'clsown'和'u1'中這些字段必須相等的地方,所以我很困惑你想讓它們與衆不同。 – 2013-03-26 15:46:30

+0

https://www.dropbox.com/s/jhiftrhrt0i0a9w/kkk.JPG – Harajukuzz 2013-03-26 16:34:35

+0

@Harajukuzz你只有2個用戶?你使用的是什麼RDBMS? – Taryn 2013-03-26 17:08:30

回答

0

由於您使用的SQL Server有幾個方法,你可以支點的數據。

可以使用聚合函數與CASE表達:

select cls_id, 
    cls_name, 
    MAX(case when rn = 1 then users_id end) user_id1, 
    MAX(case when rn = 2 then users_id end) user_id2 
from 
(
    SELECT cr.cls_id, 
     cr.cls_name, 
     u1.users_id, 
     ROW_NUMBER() over(partition by cr.cls_id order by u1.users_id) rn 
    FROM classroom cr 
    INNER JOIN clsown co 
     ON co.cls_id = cr.cls_id 
    INNER JOIN users AS u1 
     ON co.users_id = u1.users_id 
) d 
group by cls_id, cls_name; 

或者你可以使用PIVOT功能:

select cls_id, 
    cls_name, 
    user_id1, 
    user_id2 
from 
(
    SELECT cr .cls_id, 
     cr.cls_name, 
     u1.users_id, 
     'user_id'+cast(ROW_NUMBER() over(partition by cr.cls_id order by u1.users_id) as varchar2)) col 
    FROM classroom cr 
    INNER JOIN clsown co 
     ON co.cls_id = cr.cls_id 
    INNER JOIN users AS u1 
     ON co.users_id = u1.users_id 
) d 
pivot 
(
    max(users_id) 
    for col in (user_id1, user_id2) 
) piv; 
+0

thx你這麼多^^ – Harajukuzz 2013-03-26 18:15:52

+0

@Harajukuzz不客氣! :) – Taryn 2013-03-26 18:16:26

+0

如何where users_id1 = 1或users_id2 = 1 – Harajukuzz 2013-03-27 13:37:54

1

您在此處記錄的查詢實際上需要一個數據透視表,因爲您希望爲cls_id和cls_name獲取唯一值,然後將用戶排序爲列。

早在2009年,我寫了this article,它顯示瞭如何做這樣的事情。它應該幫助

0

我假設你正在使用Mysql爲您RDBMS,如果是的話,你可以利用GROUP_CONCAT()顯示records按您need,但以不同的形式。即]這個查詢會將你想要的所有額外的coloumns填入由separator分隔的單個cell中。

SELECT classroom .cls_id, 
     classroom.cls_name, 
     GROUP_CONCAT(u1.users_id ORDER BY u1.users_id SEPARATOR ', ') Users 
FROM classroom 
     INNER JOIN clsown 
       ON clsown.cls_id = classroom .cls_id 
     INNER JOIN users AS u1 
       ON clsown.users_id = u1.users_id 
     Group by classroom .cls_id 

上面的查詢將返回的記錄,像下面,

cls_id cls_name users 

    1  room1  1,2 

    2  room2  3,4 

編輯:Reference for achieving the above result in Sql server