0

このセットアップのmysqlデータベースがあります(この質問に関係のないフィールドを省略しています)

users
  id                #primary key

user_group_teachers
  id                #primary key
  teacher_id        #foreign key to users.id
  user_group_id     #foreign key to users_groups.id

user_groups
  id                #primary key

user_group_members
  id                #primary key
  pupil_id          #foreign key to pupils.id
  user_group_id     #foreign key to users_groups.id

pupils
  id                #primary key

「user_ids」と呼ばれる配列にユーザー ID のコレクションがあります。

これらのユーザー ID ごとに、そのユーザーに関連付けられている生徒 ID を

user -> user_group_teachers -> user_groups -> user_group_members -> pupils

協会。つまり、テーブル間の何らかの結合です。

だから、私は行が次のように見える何らかの結果を得たいと思っています

[1, [6,7,8,9]]

ここで、1 は教師の ID、[6,7,8,9] は生徒の ID です。各生徒 ID が 2 番目のリストに 1 回だけ表示されるようにします。

できるだけ少ない数のクエリでこれを行う方法を誰かに教えてもらえますか (または、より広く、できるだけ効率的に)。通常、user_ids には 1000 から 10,000 の ID があります。

私はこれを ruby​​ スクリプトで行っているので、クエリ間で結果を変数 (配列またはハッシュ) として保存できます。

ありがとう!ライハンの最大編集

Lyhan - ありがとうございますが、あなたの解決策はうまくいかないようです。たとえば、結果の最初の行で、あなたの方法を使用して、私は持っています

| user_id | group_concat(pupils.id separator ",")                                                                         
|       1 | 2292   

しかし、関連する瞳孔 ID をゆっくりと段階的に取得すると、異なる結果が得られます。

select group_concat(user_group_teachers.user_group_id separator ",") 
from user_group_teachers 
where user_group_teachers.teacher_id = 1 
group by user_group_teachers.teacher_id;

私は得る

| group_concat(user_group_teachers.user_group_id separator ",")  
| 12,1033,2117,2280,2281   

これらの値 (user_group ID) を別のクエリに差し込む:

select group_concat(user_group_members.pupil_id separator ",") 
from user_group_members 
where user_group_members.user_group_id in (12,1033,2117,2280,2281) 
group by user_group_members.user_group_id;

私は得る

| group_concat(user_group_members.pupil_id separator ",") 
| 47106,47107  

group_concat メソッドをありがとう、それは便利です:)

4

2 に答える 2

0

これは私が思いついたものです:

    select pupil_group_teachers.teacher_id, group_concat(pupil_group_members.pupil_id separator ',') 
    from pupil_group_teachers join pupil_groups on pupil_group_teachers.pupil_group_id = pupil_groups.id
    join pupil_group_members on pupil_group_members.pupil_group_id = pupil_groups.id
    group by pupil_group_teachers.teacher_id;

それはうまくいくようで、本当に速いです。Lyhan (その後、彼の回答は削除されました) と David Fleeman の両方が、私がそれを理解するのを助けてくれました。乾杯。

于 2013-11-07T17:39:37.573 に答える