Kohana 3 ORM: получение наиболее повторяющихся значений, ранжирование и вставка в новый объект / массив
Итак, еще один в моей серии вопросов о Kohana 3 ORM:)
У меня есть, по сути, сводная таблица, называемая connections
, connections
стол соединяет song
к keyword
, Это все замечательно и работает (благодаря моим двум последним вопросам!)
Я хочу вывести большинство связанных песен по ключевому слову. Итак, чтобы как-то запросить мой connections
таблица и вывод объекта (с произвольно ограниченным числом итераций $n
) который ранжирует песни по количеству их подключений, т.е. количество раз, что конкретно song_id
появляется для этого конкретного keyword_id
,
Я буквально не знаю, как этого добиться, не запрашивая каждую строку (!!!), а затем подсчитывая эти отдельные результаты в массиве... Должен быть более элегантный способ добиться этого?
1 ответ
Я считаю, что это больше вопрос SQL. Использование построителя запросов БД:
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" и "Ключевое слово" для каждой модели соответственно.