postgresql 如何从查询条件与查询所选记录相关的表中获取数据

h79rfbju  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(125)

语境
我有一个“user_numbers”表,其中包含以下记录:
| id|用户id|数|
| - -----|- -----|- -----|
| 1| 3|一百二十三|
| 2| 3|六六六|
| 3| 4|一百二十三|
| 4| 5个|六六六|
| 5个|六|五五五|
| 六|七个|一百二十三|
| 七个|七个|四四四|
| 八|八|四四四|
我想建立查询,找到所有用户号码和所有用户号码的用户。
例如上面的例子,我想得到用户的号码3,4,5,7和8,如果我将通过下一个条件user_id = 3进行选择。
对于用户3,我得到了数字:

  • 123
  • 666

对于第123号我得到了用户:

  • 4
  • 7

第666章我得到的是:

  • 5

用户7有号码:

  • 123
  • 444

对于444号我得到了用户:

  • 8

在结果中,我得到了所有用户号码链接的号码:
| id|用户id|数|
| - -----|- -----|- -----|
| 1| 3|一百二十三|
| 2| 3|六六六|
| 3| 4|一百二十三|
| 4| 5个|六六六|
| 六|七个|一百二十三|
| 七个|七个|四四四|
| 八|八|四四四|
我创建下一个查询:

WITH RECURSIVE founded_user_numbers AS (

    select
        un.id,
        un.user_id,
        un.number
    from p2p_market.user_numbers un
    where un.user_id = 1

    UNION

    select
        iun.id,
        iun.user_id,
        iun.number
    from p2p_market.user_numbers iun, founded_user_numbers fun
    where iun.number = fun.number and iun.id != fun.id and iun.user_id != fun.user_id
)

SELECT * FROM founded_user_numbers;

它工作正常。如果我将UNION更改为UNION ALL或通过i get infinity查询添加订单,则购买。
任何人都可以帮助我写正确的条件,以获得所需的数据。

ruoxqz4g

ruoxqz4g1#

从数据集和结果来看,给定一个用户ID,您希望所有用户至少有一个共同的数字。我看不出这里有什么递归的必要。下面是一种使用布尔窗口函数的方法:

select user_id
from (
    select n.*, 
        bool_or(user_id = 3) over(partition by number) number_has_user_id_3
    from user_numbers n
) n
group by user_id
having bool_or(number_has_user_id_3)
order by user_id

number_has_user_id_3检查用户3是否与当前行上的用户具有相同的号码-然后我们可以使用该号码来筛选用户。
你也可以使用相关子查询(尽管这可能是一种效率较低的方法):

select user_id
from user_numbers n
where exists (select 1 from user_numbers n1 where n1.number = n.number and n1.user_id = 3)
group by user_id
order by user_id

| 用户id|
| - -----|
| 3|
| 4|
| 5个|
fiddle

vbkedwbf

vbkedwbf2#

我不确定这是否是您要找的,但我认为您可以通过简单地使用自连接来实现这一点。

select distinct test.t1_user_id from
  (select
     t1.id as t1_id
    ,t1.user_id as t1_user_id
    ,t1.number as t1_number
    ,t2.user_id as t2_user_id
    ,t2.number as t2_number
  from test t1

  left join test t2
    on t1.number = t2.number
    and t1.user_id <> t2.user_id

  where t2.user_id is not null) test

SQL Fiddle

mnemlml8

mnemlml83#

with cte as(select * from user_numbers where user_id = 3)select different un.user_id from cte c,user_numbers un where un.number in(c.number)

相关问题