【问题标题】:Postgres - select row if related table has two rows in conditionPostgres - 如果相关表有两行条件则选择行
【发布时间】:2022-01-19 05:42:46
【问题描述】:

我有以下结构的表“设备”。

id | user_id | device

1 | 12 | tablet
2 | 12 | pc
2 | 12 | mobile

此表与表“users”多对一相关。一个用户可以有多个设备,例如,我想只选择有两个设备“平板电脑”和“个人电脑”的用户。

我该怎么做。

谢谢

【问题讨论】:

  • 您只有 3 个不同的设备吗?
  • 不仅3可以多得多。
  • 我建议的答案将handle这个案例。
  • 我想知道 fi 不会更好地将列设备聚合到字符串并在第二个查询中按“like”搜索。你怎么看?

标签: sql postgresql


【解决方案1】:

您可以使用多个sub-queries 来实现:

SELECT DISTINCT user_id
FROM devices
WHERE user_id NOT IN 
      (
      SELECT DISTINCT user_id
      FROM devices
      WHERE device IN
          (
          SELECT DISTINCT device
          FROM devices
          WHERE device NOT IN ('tablet', 'pc')
          )
      )
AND user_id IN
      (
      SELECT t.user_id
      FROM devices AS t
      INNER JOIN (SELECT user_id FROM devices WHERE device='pc') AS p
      ON t.user_id=p.user_id
      WHERE device='tablet'
      )

这不是一个优化的查询。我们可以使用JOINS 代替WHERE 让它更快

Demo here

【讨论】:

    【解决方案2】:

    试试这个

    select user_id
    from devices
    group by user_id 
    having count(*) = 2 and max(device) = 'tablet' and min(device) = 'pc'
    

    demo

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2017-01-13
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2020-04-12
      • 2022-01-24
      相关资源
      最近更新 更多