2011-01-25 11 views
0

所以,另一個我一系列的Kohana 3 ORM的問題:)Kohana的ORM 3:獲得最重複的值,排名,並插入新的對象/數組

我有,實質上是一個透視表,稱爲connectionsconnections表將song連接到keyword。這是非常棒的工作(感謝我的最後兩個問題!)

我想通過關鍵字輸出最多連接的歌曲。因此,以某種方式查詢我的connections表並輸出一個對象(具有任意有限次數的迭代$n),它按照它們已連接的次數對歌曲進行排名,即。特定song_id針對該特定keyword_id出現的次數。

我幾乎不知道如何實現這一點,不查詢每一行(!!!),然後在數組中計算這些單獨的結果....必須有一個更優雅的方法來實現這一點?

回答

2

我相信這是更多的SQL問題。使用DB查詢生成器:

DB::select('songs.*')->select(array('COUNT("keywords.id")', 'nconnections')) 
    ->from('songs') 
    ->join('connections', 'LEFT')->on('connections.song_id', '=', 'songs.id') 
    ->join('keywords', 'LEFT')->on('connections.keyword_id', '=', 'keywords.id') 
    ->group_by('songs.id') 
    ->order_by('nconnections') 
    ->as_object('Model_Song') 
    ->execute(); 

或SQL

SELECT `songs`.*, COUNT(`keywords`.`id`) AS `nconnections` FROM songs 
    LEFT JOIN `connections` ON `connections`.`song_id` = `songs`.`id` 
    LEFT JOIN `keywords` ON `connections`.`keyword_id` = `keywords`.`id` 
GROUP BY `songs`.`id` ORDER BY `nconnections` 

應該回到你想要的結果。

您需要在您的歌曲模型中有一個名爲nconnections的無障礙財產。最簡單的方法是添加一個公共成員,以免篡改ORM的內部工作。


我假設你使用的是被稱爲「宋」的模式,連接到一個「歌曲」表,「關鍵字」模型鏈接到「關鍵字」表和「關係」表中的外分別爲每個模型鍵「song_id」和「keyword_id」。

相關問題