【问题标题】:ActiveRecord/PostgreSQL -- Sorting by first association valueActiveRecord/PostgreSQL -- 按第一个关联值排序
【发布时间】:2017-04-05 11:20:38
【问题描述】:

我在构建一个查询时遇到问题,该查询将按多对多关系中关联表的列进行排序。

例如,一个用户有_many 个标题和一个标题有_many 个用户。它们的关系位于 UserTitle 表中。我将如何编写一个范围(以便它可以与其他查询链接) 返回按用户第一个标题的“名称”列排序的用户

<User id: 1, name: 'Bob'>
<User id: 2, name: 'Joe'>
<UserTitle id: 1, user_id: 1, title_id: 2>
<UserTitle id: 2, user_id: 2, title_id: 1>
<UserTitle id: 3, user_id: 2, title_id: 2>
<Title id: 1, name: 'A-Name'>
<Title id: 2, name: 'B-Name'>

如果这些是用户对象及其关联表在我的数据库中,我希望排序查询首先返回 Joe,然后是 Bob(因为 Joe 的第一个标题是其中包含 A 的标题,它在字母表中排在第一位)。使用 ruby​​ 逻辑这很容易,但是在使用 ActiveRecord 构建 SQL 查询时,我不知道如何处理它。

【问题讨论】:

  • 并且用户的“第一个”标题也应该是字母顺序的第一个? (您知道表中的行没有自然的“顺序”。)您的UserTitle id 很可能应该是不同的(目前都是1),但这仍然不是定义“第一个”标题的好方法。
  • 不,没必要。也感谢您发现错误@ErwinBrandstetter
  • 那么你有答案了吗?

标签: mysql ruby-on-rails postgresql sorting activerecord


【解决方案1】:

一种方式(多种方式)是CROSS JOIN LATERAL

SELECT u.*
FROM   "User" u
CROSS  JOIN LATERAL (
   SELECT title_id
   FROM   "UserTitle"
   WHERE  user_id = u.user_id 
   ORDER  BY usertitle_id
   LIMIT  1
   )
JOIN  "Title" t USING (title_id);

最佳查询取决于您的要求和环境的未公开细节。

相关:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多