0

ユーザー、コース、登録の 3 つのテーブルがあります。Enrollments テーブルには外部キーが含まれているため、それぞれ結合を行うことができます: users.pk1 = registrations.u_pk1 および course.pk1 = registrations.c_pk1。Users テーブルには、教授と学生の両方が含まれています。ここまでは順調ですね!

私がやろうとしているのは、名前に文字列 2013 が含まれるすべてのコースのリストを生成し、次に各コースのすべての教授を取得し、最後に、以下のみを持つ登録テーブルから各コースのすべての学生の数を取得することです列: pk1、c_pk1、u_pk1、役割。

これは私がやろうとしていることですが、 Count はサブクエリを引数として受け入れないため、明らかに機能しません:

select c.name, u.name, count(select * from enrollments where role = 'student') 
from courses c, users u, enrollments e
where u.pk1 = e.u_pk1 and c.pk1 = e.c_pk1 
and c.name like '%2013%' and e.role = 'professor'
order by c.name;

これを希望どおりに機能させる方法に関するヒントはありますか?

...

後で編集:Trogdorのソリューションを使用して、カウントの観点から機能させることができましたが、コースを一度だけリストし、その後にすべての教授の名前を1行に表示する方法に行き詰まっています。たとえば、むしろ次のようなものがあります。

course1 prof1 13
course1 prof2 13
course2 prof3 25

代わりに、次のようになります。

course1 prof1,prof2 13
course2 prof3 25

など...どうすればこれを達成できるかについてのヒントはありますか?

4

2 に答える 2

1

これを試して:

select c.name, u.name, x.total
from courses c, users u, enrollments e, 
    (select c_pk1, count(*) as total 
     from enrollments 
     where role='student' 
     group by c_pk1) x
where u.pk1 = e.u_pk1 and c.pk1 = e.c_pk1 
and c.name like '%2013%' and e.role = 'professor' and c.pk1 = x.c_pk1
order by c.name;

選択で相関サブクエリを使用することもできます。

select c.name, u.name, 
    (select count(*) from enrollments e2 
      where e2.role = 'student' and e2.c_pk1 = c.pk_1) 
from courses c, users u, enrollments e
where u.pk1 = e.u_pk1 and c.pk1 = e.c_pk1 
and c.name like '%2013%' and e.role = 'professor'
order by c.name;

ただし、この 2 番目のクエリは、最初のクエリよりも著しく遅くなる可能性があります。

于 2013-09-01T00:36:37.610 に答える
0

私はこのようにします。より明確に。これをテストする方法はありません。バグがある場合は申し訳ありません。しかし、それはあなたにアイデアを与えるはずです。

select c.name, p.name, count(*)
from courses c
join enrollments e on e.c_pk1 = c.pk1
join users p on p.pk1 = e.u_pk1 and e.role = 'professor'
join users s on s.pk1 = e.u_pk1 and e.role = 'student'
where c.name like '%2013%'
group by c.name, p.name
order by c.name, p.name
于 2013-08-31T23:40:28.770 に答える