【问题标题】:sort club based on club members in SQL在 SQL 中根据俱乐部成员对俱乐部进行排序
【发布时间】:2017-06-30 18:03:14
【问题描述】:

我有一个 Rails 应用程序,其中有 2 张桌子......俱乐部和俱乐部成员......

俱乐部有很多俱乐部会员 和俱乐部成员属于俱乐部... 我将提供表格列的屏幕截图

我的俱乐部成员使用 club_id 外键引用俱乐部

我想根据俱乐部成员的最大数量找出俱乐部... 我正在使用这样的查询..但这不起作用..任何人都可以帮助我根据俱乐部成员的数量订购俱乐部吗?

我当前的查询

SELECT clubs.*, COUNT(club.id) AS total
FROM clubs
  INNER JOIN clubmembers ON clubs.id = clubmembers.id
  GROUP BY clubmembers.club_id
  ORDER BY total DESC;

【问题讨论】:

  • 这是一种一次性的好奇心,还是一种经常使用的排序方法?你有能力添加一列吗?
  • 是的,我可以在任何表格中添加列

标签: mysql sql ruby-on-rails


【解决方案1】:

您使用了错误的密钥加入:

SELECT c.*, COUNT(cm.id) AS total
FROM clubs c INNER JOIN
     clubmembers cm
     ON c.id = cm.club_id
GROUP BY c.id
ORDER BY total DESC;

请注意,我还介绍了表别名。这些使查询更易于编写和阅读。

【讨论】:

  • 这给出了相反数量的成员.. 像俱乐部 1 有 3 个成员...查询显示 2... 并且俱乐部 2 有 2 个成员并显示 3,我将 DESC 更改为 ASC,现在它工作...谢谢...你能解释一下我原来的查询是怎么错的,以便我能理解我面临的问题吗?
  • 这是您无需进一步更新数据库即可在 SQL 中进行查询的方式。但是,此请求在性能方面不会很好地扩展。如果性能不是问题(或者因为数据库很小并且将保持很小,或者请求只是手动发出,......等等)这将起作用。
【解决方案2】:

在属于关联上使用 rails :counter_cache 选项。

This blog 展示了如何快速设置。

长话短说,您向clubs 添加一个名为members_count 的列。然后更新 members 模型以将以下内容作为关联行(包括您已经拥有的任何其他关联修饰符)

belongs_to :author, counter_cache: true

然后,如果您的数据集足够小,则需要通过运行Club.reset_counters 来初始化现有数据的计数,如果数据集足够大,则需要遵循the blog 中列出的指南。

完成此设置后,您将能够简单地将.order(members_count: :desc) 添加到俱乐部上的任何 Rails 查询中。这消除了加入请求的需要(通过让成员在加入/离开俱乐部时更新计数)。这将提高排序的效率。

注意

这仅适用于仅通过 Rails 创建/更新/销毁数据的情况。如果任何其他系统修改数据或直接编辑数据库,它不会触发回调,也不会更新计数器缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2022-01-20
    相关资源
    最近更新 更多