Kohana 3 ORM:获取最多重复的值、排名并插入到新对象/数组中

发布于 2024-10-14 05:49:36 字数 427 浏览 3 评论 0原文

因此,这是我的 Kohana 3 ORM 问题系列中的另一个问题:)

本质上,我有一个数据透视表,称为连接connections 表将歌曲 连接到关键字。这一切都很棒并且有效(感谢我的最后两个问题!)

我想按关键字输出最相关的歌曲。因此,要以某种方式查询我的 connections 表并输出一个对象(具有任意有限的迭代次数 $n),该对象按歌曲的连接次数对歌曲进行排名, IE。特定 song_id 对于特定 keyword_id 出现的次数。

我真的不知道如何实现这一点,而不查询每一行(!!!),然后在数组中计算这些单独的结果......必须有一种更优雅的方法来实现这一点?

So, another in my series of Kohana 3 ORM questions :)

I have, essentially, a pivot table, called connections. The connections table connects a song to a keyword. That's all great and working (thanks to my last two questions!)

I want to output the most connected songs by keyword. So, to somehow query my connections table and output an object (with an arbitrarily limited number of iterations $n) that ranks songs by the number of times they have been connected, ie. the number of times that particular song_id appears for that particular keyword_id.

I have literally no idea how to achieve this, without querying every single row (!!!) and then counting those individual results in an array.... There must be a more elegant way to achieve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

×眷恋的温暖 2024-10-21 05:49:36

我认为这更多的是一个 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” ' 分别针对每个模型。

I believe this is more of an SQL question. Using the DB query builder:

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();

or in 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`

should return the result you want.

You'll want to have an accessible property called nconnections in your song model. The simplest way to do that is to add a public member so you don't tamper with ORM's inner workings.


I'm assuming you're using a model called 'Song', linked to a 'songs' table, a 'Keyword' model linked to a 'keywords' table and in the 'connections' table foreign keys 'song_id' and 'keyword_id' for each model respectively.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文