2016-04-20 172 views
0

我有兩個表格:城市列表以及每個城市的類別列表。在連接查詢中限制結果

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。其他一切支持這些或那些。添加這個越來越多的缺失功能的列表Oracle不太可能添加到MySql中,因此它不必與自身競爭...... CTE,窗口化函數,索引視圖...我可以繼續。 –

回答

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)採取指數的優勢。