语境
我有一个“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查询添加订单,则购买。
任何人都可以帮助我写正确的条件,以获得所需的数据。
3条答案
按热度按时间ruoxqz4g1#
从数据集和结果来看,给定一个用户ID,您希望所有用户至少有一个共同的数字。我看不出这里有什么递归的必要。下面是一种使用布尔窗口函数的方法:
number_has_user_id_3
检查用户3
是否与当前行上的用户具有相同的号码-然后我们可以使用该号码来筛选用户。你也可以使用相关子查询(尽管这可能是一种效率较低的方法):
| 用户id|
| - -----|
| 3|
| 4|
| 5个|
fiddle
vbkedwbf2#
我不确定这是否是您要找的,但我认为您可以通过简单地使用自连接来实现这一点。
SQL Fiddle
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)