【问题标题】:postgres - finding unique users which have specific recordspostgres - 查找具有特定记录的唯一用户
【发布时间】:2013-08-27 12:02:45
【问题描述】:

我需要一些帮助来使用 postgres 完成以下查询。

例如,我有下表:(这是我要完成的工作的本质)

让我们称之为 - table_user_flags

user_id flag
1        1
1        2
2        1
2        3
3        1
3        2
3        3

我需要找到所有具有特定标志的记录的用户(在标志列下,每个标志至少有 1 条记录)

示例: 所有具有标志 1,3(即 1 和 3)的记录的用户都回答(user_id 2,3) (但也想让扩展变得简单,以便我可以请求标志 1、2、3、4、5 等)

我尝试了很多东西,不幸的是我无法很好地表达情况,无法在谷歌上找到答案。

我最好的猜测(这是蹩脚的,可能是错误的)是(并提供了标志数组 - $flag_arr)

select a.user_id
from table_user_flags a, table_user_flags b
where a.flag = $flag_arr[0] and b.flag = $flag_arr[1] and a.user_id=b.user_id

但是这个策略很慢,而且只有在我需要 2 个标志时才有效,当我需要超过 2 个标志时,我需要为 flags_arr 的每个长度编写特定的查询。

我该如何解决这个问题?

我将不胜感激!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:
    SELECT user_id
    FROM table_user_flags
    WHERE flag IN (1,2)
    GROUP BY user_id
    HAVING COUNT(DISTINCT flag)=2;
    

    Fiddle

    【讨论】:

      【解决方案2】:
      select user_id
      from table_user_flags as t
          inner join (select unnest($flag_arr) as flag) as c on c.flag = t.flag 
      group by t.user_id
      having count(distinct t.flag) = array_length($flag_arr, 1);
      

      select user_id
      from table_user_flags as t
      where t.flag = any($flag_arr)
      group by t.user_id
      having count(distinct t.flag) = array_length($flag_arr, 1);
      

      sql fiddle demo

      如果user_id, flag_id 在表格中是唯一的,您可以使用count(*)

      【讨论】:

        猜你喜欢
        • 2021-10-26
        • 2020-10-21
        • 1970-01-01
        • 2022-08-23
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多