【问题标题】:Postgresql Query where parent's parent ID equals idPostgresql 查询父的父 ID 等于 id
【发布时间】:2021-02-28 05:26:47
【问题描述】:

我有以下表关系结构。 (我对 SQL 还很陌生,所以请放轻松)另外,我正在使用 Postgresql,如果它改变了任何东西,我会发现它。

Users -> Services -> Sessions -> Visits

基本上,用户有多个服务,服务有多个会话,会话有多个访问。

我正在尝试构建一个 COUNT 查询来计算服务在一段时间内的所有访问。我的问题是这需要查询访问会话的服务 ID。

到目前为止,我提出了以下查询:

SELECT COUNT(*)
FROM visits
WHERE (created_at BETWEEN now()::timestamp - (interval '30days') AND now()::timestamp)
AND (session.service = 'NDBKaG3a68tAOgHS');

在尝试运行时出现以下错误:

ERROR:  missing FROM-clause entry for table "session"
LINE 4: AND (session.service = 'NDBKaG3a68tAOgHS')

我尝试查询会话的服务是AND (session.service = 'NDBKaG3a68tAOgHS');这一行我应该如何查询这个父级的父级关系?

【问题讨论】:

  • 您只需要加入父表。它应该类似于FROM visits inner join sessions on visits.session = sessions.idWHERE 子句然后需要会话而不是会话。我假设表名是复数,主键称为 id,外键是父表的单数。
  • @JonathanWillcock 你的假设是正确的,我现在就试试你的建议
  • @JonathanWillcock 工作就像一个魅力!你想发布一个真实的答案,我会把它标记为接受的

标签: sql database postgresql


【解决方案1】:

您只需加入父表。应该是这样的:

SELECT COUNT(*)
FROM visits INNER JOIN sessions on visits.session = sessions.id
WHERE (visits.created_at BETWEEN now()::timestamp - (interval '30days') AND now()::timestamp)
AND (sessions.service = 'NDBKaG3a68tAOgHS');

我假设表名是复数,主键称为id,外键是父表的单数。

注意这是标准的SQL 语法,所以这个解决方案不是 PostgreSQL 特有的,但也适用于其他数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2020-09-17
    • 2021-11-22
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多