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" и "Ключевое слово" для каждой модели соответственно.

Другие вопросы по тегам