通过 postgres 中的连接表对行进行排序

Posted

技术标签:

【中文标题】通过 postgres 中的连接表对行进行排序【英文标题】:Ordering rows by joined tables in postgres 【发布时间】:2017-11-09 23:03:07 【问题描述】:

我什至很难想出正确的问题标题。我会接受任何建议来编辑它。

我的问题:我有一个包含两个模型的应用(工作板):UserJob。用户可以有很多工作,工作可以是premiumfree。作业也可以过期活动。如果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)

我看不到包含 PremiumFree 的字段的名称,所以我编了一个!另外,我将您的JOIN 更改为INNER JOIN,因为WHERE 子句在任何情况下都有这种效果。

【讨论】:

我不明白你在没有任何聚合函数的情况下使用GROUP BYclause... @Arkhena,ORDER BY 中的聚合需要它...还删除重复项,因此不需要 DISTINCT。

以上是关于通过 postgres 中的连接表对行进行排序的主要内容,如果未能解决你的问题,请参考以下文章

通过根据提交历史对行进行排序来合并,而不是标记冲突

Pandas 根据列中的最小值到最大值对行进行重新排序

如何按r中其他列中的条件对行进行排序?

按自定义数组对行进行排序

AngularJS按表头对行进行排序

Bootstrap jquery sortable 只对行进行排序?