2016-04-20 15 views
0

私は2つのテーブルを持っています:都市のリストと各都市のカテゴリのリスト。結合クエリの結果を制限する

Table tv_village 

id | name 
-------------- 
1  | London 
2  | Paris 


Table tv_village_category 

village_id | category | total 
----------------------------- 
1   | event  | 10 
1   | realestate | 15 
1   | job  | 8 
1   | place  | 20 
2   | event  | 42 
2   | realestate | 66 
2   | job  | 83 
2   | place  | 55 

私の質問

私は、各都市のトップ3カテゴリー(合計でソート)を取得する必要があります。私はこのクエリをしようとすると、私は

を試してみました何

は、それがフィールドv.idがサブクエリで不明であることを私に伝えます。

SELECT * 
    FROM tv_village v 
    INNER JOIN (
     SELECT * 
     FROM tv_village_category vc2 
     WHERE vc2.village_id = v.id 
      AND vc2.total > 0 
     ORDER BY vc2.total DESC 
     LIMIT 3 
    ) vc 
    ORDER BY v.id, vc.total DESC 

私は性能がを重要、と私のテーブルは(36K都市と1Mカテゴリ)ビット巨大であることを追加する必要があります。

よろしく、

+2

これはMySql:Oracleには横結合があり、SQL ServerにはAPPLYがありますが、DBでは簡単に使えるものの1つです。他のすべてがそれらのいずれかをサポートします。 OracleがMySqlに追加する可能性の低い欠点の機能のリストを追加してください。それで、CTE、Windowing関数、索引付けされたビューなど...競合する必要はありません。 –

答えて

0

一つの方法は、変数を試してみることです。

select v.* 
from (select v.*, 
      (@rn := if(@v = village_id, @rn + 1, 
         if(@v := village_id, 1, 1) 
         ) 
      ) as seqnum 
     from tv_village v cross join 
      (select @rn := 0, @v := '') params 
     order by village, total desc 
    ) v 
where seqnum <= 3; 

これはtv_village(village_id, total)のインデックスを利用することができます。

関連する問題