【问题标题】:Writing query to return rows only if they contain every item from another table仅当行包含另一个表中的每个项目时才编写查询以返回行
【发布时间】:2021-08-30 14:55:41
【问题描述】:

我有一个相对复杂的问题,我想用一个查询来解决,我想知道它是否可以用一个查询来完成。

举个简单的例子,我有以下表格:

  • authors(身份证、名字、姓氏、生效日期、退休日期)
  • articles(id、author_id、标题、内容)
  • recipients(身份证、姓名、电子邮件)
  • subscriptions(作者 ID,电子邮件)

例如订阅如下所示:

// Subscriptions table

author_id   email
1           'johnsmith@gmail.com'
1           'jackymoon@gmail.com'
2           'edmonix@gmail.com'
1           'louredwood@gmail.com'
2           'louredwood@gmail.com'
3           'louredwood@gmail.com'
4           'louredwood@gmail.com'

等等……

我想返回一个电子邮件列表,其中仅当电子邮件在表中出现的次数等于第二个查询时才会返回。

query_1 = SELECT email FROM recipients
          WHERE email has an entry for every author returned from query_2...

query_2 = SELECT * FROM authors
          WHERE current_date BETWEEN effective_date AND retirement_date

到目前为止,我只需要进行简单的查询,因此非常感谢任何帮助。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    简单的解决方案是在 WHERE 子句中使用子查询。

    SELECT .... WHERE (SELECT COUNT(*) FROM subscriptions s WHERE s.email = rp.email) = (SELECT COUNT(*) FROM authors)

    (查找订阅数等于作者数的 rp 记录) 或类似的组合 - 例如查找未订阅作者数量等于 0 的所有 rp 记录

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多