【发布时间】:2022-01-22 17:58:04
【问题描述】:
例如我们有 2 个表:
TABLE users WITH FIELDS
id
TABLE providers WITH FIELDS
id
TABLE subscriptions WITH FIELDS
id
start_date
provider_id - OneToMany
user_id - OneToMany
还有下面的sql语句:
SELECT subscription.id
FROM subscriptions
INNER JOIN providers ON
subscriptions.provider_id = providers.id AND
providers.id = 2
INNER JOIN (
SELECT user_id, MAX(start_date) AS start_date
FROM subscriptions GROUP BY user_id
) AS max USING (user_id, start_date)
结果,我想为每个用户获取 provider 为(在本例中)为 2 且具有最新 start_date 的 subscription .
在这种情况下,我们使用provider_id 2,但该值是动态的。
我希望第二个 INNER JOIN 中的 MAX 只接受零售商为 2 的订阅,但事实并非如此,它会接受所有订阅。这是为什么呢?
提前致谢。
【问题讨论】:
-
第二次加入的 ON 子句在哪里?应该使用哪个字段来连接两个数据源?
-
您的架构可能存在设计问题。
-
@heximal 我使用 USING 而不是 ON
-
将开始日期存储在记录中是不够的,您还需要存储结束日期,否则无论您是否意识到,您最终都会计算每个查询的结束日期。在这种情况下,您的问题是因为您没有简单的方法来计算订阅是否“现在”仍然有效 - 因为您需要那个结束日期。尝试查找最晚的开始日期可以替代缺少的结束日期。
-
@TimBiegeleisen 这就像我的实际数据库模式的更简单版本,昨天我开始使用 MAX 和 USING 的 INNER JOIN 来寻找解决方案,我对这些场景还是新手。跨度>
标签: sql postgresql join inner-join