通过 postgres 中的连接表对行进行排序
Posted
技术标签:
【中文标题】通过 postgres 中的连接表对行进行排序【英文标题】:Ordering rows by joined tables in postgres 【发布时间】:2017-11-09 23:03:07 【问题描述】:我什至很难想出正确的问题标题。我会接受任何建议来编辑它。
我的问题:我有一个包含两个模型的应用(工作板):User、Job。用户可以有很多工作,工作可以是premium
或free
。作业也可以过期或活动。如果valid_until
参数IS NOT NULL
则它们处于活动状态,否则它们已过期(我有一个后台作业每天自动设置)。
我正在尝试选择拥有活跃职位的用户,但我希望拥有高级职位的用户排在拥有免费职位的用户之前,假设用户可以同时拥有活跃的高级职位和免费职位发布。
SELECT DISTINCT users.id, users.email FROM users
LEFT OUTER JOIN jobs ON jobs.owner_id = users.id
WHERE jobs.valid_until IS NOT NULL;
上面的查询正确地选择了至少有一个活动工作(高级或免费)的用户,我只需要根据工作表对用户进行排序。我将不胜感激任何帮助/提示。谢谢!
【问题讨论】:
您不希望用户根本没有工作,因此您应该使用(内部)联接而不是左联接。这里 left join 是可行的,因为碰巧您对活动/有效工作的测试会消除那些失业用户。但是如果你要求 jobs.valid_until IS NULL 你也会得到失业用户。左连接返回内连接返回的内容加上由空值扩展的不匹配的左表行。 【参考方案1】:我相信以下内容会满足您的需求:
SELECT users.id, users.email FROM users
JOIN jobs ON jobs.owner_id = users.id
WHERE jobs.valid_until IS NOT NULL
GROUP BY users.id, users.email
ORDER BY min(case when jobs.type = 'premium' then 1 else 2 end)
我看不到包含 Premium
与 Free
的字段的名称,所以我编了一个!另外,我将您的JOIN
更改为INNER JOIN
,因为WHERE
子句在任何情况下都有这种效果。
【讨论】:
我不明白你在没有任何聚合函数的情况下使用GROUP BY
clause...
@Arkhena,ORDER BY 中的聚合需要它...还删除重复项,因此不需要 DISTINCT。以上是关于通过 postgres 中的连接表对行进行排序的主要内容,如果未能解决你的问题,请参考以下文章