1

初めて使用しました。

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

内部結合の方法がわかりません。私は何が間違っているのですか?

答えてくれてありがとう。

4

3 に答える 3

1

ここで注目しているクエリでは、cls_idとcls_nameの一意の値を取得して、ユーザーを列に並べ替える必要があるため、実際にはピボットが必要になります。

私は2009年にこのようなことをする方法を示すこの記事を書きました。それは役立つはずです

于 2013-03-26T16:23:42.393 に答える
0

Mysqlを使用していると仮定します。その場合はRDBMSGROUP_CONCAT()recordsを使用して、必要に応じて、ただし別の形式でを表示できます。すなわち]このクエリは、必要なすべての追加を、で区切られcoloumnsた単一に詰め込みます。cellseparator

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 

編集: SQLサーバーで上記の結果を達成するためのリファレンス

于 2013-03-26T17:50:36.213 に答える
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;
于 2013-03-26T18:08:23.120 に答える