2016-08-13 5 views
0
select name , room 
from class 
where room="R128" 
    or name in (select cname 
       from enrolled 
       group by cname 
       having count(*)>=5; 
      ); 

また、このクエリは、前述のように、それぞれの名前がcnameのいずれかに存在するかどうかを調べるので、時間がかかるようです。あなたはもっと良いことはできますか?この構文で何が問題になっていますか?私はそれをどのように機能させるべきですか?

+0

これはクイズです。 _Oh Lord私はrevise_ – RiggsFolly

+1

を実行しました。 '> = 5;' – RiggsFolly

答えて

0

文字列定数の前後の二重引用符は不審なものですが、動作するはずです。おそらく次のようにクエリは修正されませんが、すべての列名を修飾してエイリアスを使用する必要があります。そして、それが明示的joinではなくin利用するほうが良いことが多い - だけでなく、MySQLのより新しいバージョンでは、このパフォーマンスの問題を修正しましたが、あなたは試すことができます:

select c.name, c.room 
from class c left join 
    (select e.cname 
     from enrolled e 
     group by e.cname 
     having count(*) >= 5 
    ) ec 
    on c.name = ec.cname 
where c.room = 'R128' or ec.cname is not null 

とパフォーマンスのために、あなたは、インデックスをお勧めしますclass(name, room)enrolled(cname)には、次のようなクエリを書くことができます。

select c.name, c.room 
from class c 
where c.room = 'R128' or 
     (select count(*) from enrolled e where e.cname = c.name) >= 5 
+0

Gordonありがとうございます。また、ここで何が間違っているのを見つけることができますか?:snum in(snum from enrolled;); –

+1

@StuperDuper。 。 。質問は質問ではなく、コメントでお願いします。 –

+0

オクラホマ次回から気をつけて@Gordon –

関連する問題