如何用Python查询SQLite数据库找出两两互识的三位用户?
找出SQLite数据库中两两互识的三位用户
现有名为social_links的SQLite数据库,其中列A代表认识列B的用户,数据如下:
A B 1 2 1 3 1 4 2 3 2 5 4 2 5 3 5 4
需要编写SQL查询语句,找出所有两两互识的三位用户(即任意两人之间都存在互相认识的关系:比如用户1认识2,2也认识1;1认识3,3也认识1;2认识3,3也认识2),最终将结果以指定格式的Pandas DataFrame展示。
补全后的SQL查询语句及完整代码
核心思路是通过多次自连接验证两两双向好友关系,同时用用户ID排序避免重复组合:
import sqlite3 import pandas as pd # 连接数据库 conn = sqlite3.connect('social_links.db') c = conn.cursor() # 补全的SQL查询语句 3users_query = ''' SELECT DISTINCT u1.A, u2.A, u3.A FROM social_links u1 JOIN social_links u2 ON u1.A < u2.A AND EXISTS (SELECT 1 FROM social_links WHERE A = u2.A AND B = u1.A) JOIN social_links u3 ON u2.A < u3.A AND EXISTS (SELECT 1 FROM social_links WHERE A = u3.A AND B = u1.A) AND EXISTS (SELECT 1 FROM social_links WHERE A = u3.A AND B = u2.A) AND EXISTS (SELECT 1 FROM social_links WHERE A = u1.A AND B = u3.A) AND EXISTS (SELECT 1 FROM social_links WHERE A = u2.A AND B = u3.A) ''' c.execute(3users_query) dfUsersKnown = pd.DataFrame(c.fetchall(), columns=['A', 'B', 'C']) print(dfUsersKnown) # 关闭连接 conn.close()
语句逻辑说明
u1.A < u2.A < u3.A确保每组用户ID按升序排列,避免(1,2,3)和(2,1,3)这类重复组合;- 每个
EXISTS子句验证双向好友关系:比如EXISTS (SELECT 1 FROM social_links WHERE A = u2.A AND B = u1.A)用来确认u2也认识u1,结合u1认识u2的初始记录,完成两人互识的验证; DISTINCT进一步过滤可能的重复结果,确保输出唯一组合。
执行后输出的DataFrame格式如下:
A B C 0 1 2 3 1 1 2 4 2 2 3 5 3 2 4 5
内容的提问来源于stack exchange,提问作者schizetia
相关产品推荐
相关产品推荐

