我在构建按多对多关系中关联表的列进行排序的查询时遇到问题。
例如,一个用户 has_many Titles,一个标题 has_many Users。它们的关系位于 UserTitle 表中。我将如何编写一个范围(以便它可以与其他查询链接) 返回按用户第一个标题的“name”列排序的用户
<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'>
如果这些是我的数据库中的 User 对象及其关联表,我希望排序查询首先返回 Joe,然后返回 Bob(因为 Joe 的第一个标题是带有 A 的标题,它在字母表中排在第一位)。使用 ruby 逻辑这很容易,但是当涉及到使用 ActiveRecord 构建 SQL 查询时,我不知道如何处理它。
最佳答案
(多种方法中的)一种是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);
最佳查询取决于您的要求和环境的未公开详细信息。
相关:
关于mysql - ActiveRecord/PostgreSQL -- 按第一个关联值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730751/