sql好友关系查询,好友表设计

askjhx 2012-07-18 11:55:05

我现在有一张表,具体设计是这样的

id, Uid, Fid, Userimp, Addtime 对应解释如下 (自增长编号,用户编号,好友编号,好友印象,添加时间)

插入时候数据如下 :

1 100 101 '' 2012-01-12
2 100 102 '' 2012-01-12
3 100 103 '' 2012-01-12
4 100 104 '' 2012-01-12

5 101 100 '' 2012-01-13
6 101 102 '' 2012-01-13

7 105 101 '' 2012-01-14

具体说明如下 :用户编号为 100 的人添加了4个好友 用户编号为 101的人添加了2个好友 而用户编号为 105 的添加了1个好 友

我现在要查询到三种情况:第一就是我添加了别的用户为好友别的用户也添加了我为好友 (如:100和101)
第二就是我添加了别的用户为好友但是别的用户没有加我好友 (如:100和103)
第三就是别人添加了我为好友我却没有加别人为好友 (如:105和101)

小弟愚钝 ,第一种情况比较好些 ,但是第二种和第三种就不会写了 ,望各位不吝赐教 !
...全文
637 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
红衣 2014-09-17
  • 打赏
  • 举报
回复
白天的猫头鹰 2012-07-19
  • 打赏
  • 举报
回复
在插入数据的时候定义插入数据的规则
白天的猫头鹰 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用楼主 的回复:
我现在有一张表,具体设计是这样的

id, Uid, Fid, Userimp, Addtime 对应解释如下 (自增长编号,用户编号,好友编号,好友印象,添加时间)

插入时候数据如下 :

1 100 101 '' 2012-01-12
2 100 102 '' 2012-01-12
3 100 103 '' 2012-01-12
4 100 ……
[/Quote]

这个其实在uid中可以规定只存储主动添加别人好友的用户id,比如A 加B为好友,则存储A,b后来加A为好友只要判断是否存在一条A 加B为好友的记录,若存在则更新为互为好友,没有则插入一条记录

askjhx 2012-07-19
  • 打赏
  • 举报
回复
为什么结贴不能给你分 ?[Quote=引用 5 楼 的回复:]

SQL code
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create table #TB (id int,Uid int,Fid int,Userimp datetime,Addtime sql_variant)
insert into #TB
select 1,100,101,'2012……
[/Quote]
askjhx 2012-07-19
  • 打赏
  • 举报
回复
测试了一下 ,正确 .非常感谢 ![Quote=引用 5 楼 的回复:]

SQL code
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create table #TB (id int,Uid int,Fid int,Userimp datetime,Addtime sql_variant)
insert into #TB
select 1,100,101,'2012……
[/Quote]
askjhx 2012-07-19
  • 打赏
  • 举报
回复
恩 ,这个思路也不错 .谢谢 !但是可能现在再设计表已经为时过晚了 .所以现在我还是最想知道最好的办法如何查询我现在的表 .[Quote=引用 6 楼 的回复:]

引用楼主 的回复:
我现在有一张表,具体设计是这样的

id, Uid, Fid, Userimp, Addtime 对应解释如下 (自增长编号,用户编号,好友编号,好友印象,添加时间)

插入时候数据如下 :

1 100 101 '' 2012-01-12
2 100 102 '' 2012-01-12
3 100 103 '' 2012-01-12
4 100 ……
[/Quote]
askjhx 2012-07-18
  • 打赏
  • 举报
回复
我现在这是有账号表的 ,uid 和 fid 都是外键 [Quote=引用 3 楼 的回复:]

设计一个账号表,一个好友表,如果数据量太大了,最好是一个用户一张好友表
[/Quote]
  • 打赏
  • 举报
回复
设计一个账号表,一个好友表,如果数据量太大了,最好是一个用户一张好友表
askjhx 2012-07-18
  • 打赏
  • 举报
回复
那请问一下好友表怎么样设计比较好呢 ?[Quote=引用 1 楼 的回复:]

这样的表设计 会让你查询很痛苦。
[/Quote]
--小F-- 2012-07-18
  • 打赏
  • 举报
回复
这样的表设计 会让你查询很痛苦。
cxmcxm 2012-07-18
  • 打赏
  • 举报
回复
建议建一子表对应主表的姓名id号
子表字段如下:
主表姓名id,
好友姓名id,
是否被对方设为好友

白天的猫头鹰 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
我现在有一张表,具体设计是这样的

id, Uid, Fid, Userimp, Addtime 对应解释如下 (自增长编号,用户编号,好友编号,好友印象,添加时间)

插入时候数据如下 :

1 100 101 '' 2012-01-12
2 100 102 '' 2012-01-12
3 100 103 '' 2012-01-12
4 100 104 ……
[/Quote]
以下是我想到的设计的好友数据结构,抛砖引玉一下,看看是不是存在什么不足之处,谢谢
ID, friendPersonOneId, FriendPersonTwoId, addByMySelf, addByOthers addTime addNote
1 A B 1 1 now() 'A,B互相加为好友'
2 C B 1 0 now() 'C加B为好友'
3 D B 0 1 now() 'D被B加为好友'

SQL77 2012-07-18
  • 打赏
  • 举报
回复
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create table #TB (id int,Uid int,Fid int,Userimp datetime,Addtime sql_variant)
insert into #TB
select 1,100,101,'2012-01-12',null union all
select 2,100,102,'2012-01-12',null union all
select 3,100,103,'2012-01-12',null union all
select 4,100,104,'2012-01-12',null union all
select 5,101,100,'2012-01-13',null union all
select 6,101,102,'2012-01-13',null union all
select 7,105,101,'2012-01-14',null
--1
select * from #TB T
WHERE EXISTS(SELECT 1 FROM #TB WHERE UID=T.FID AND FID=T.UID)

---2
select * from #TB T
WHERE EXISTS(SELECT 1 FROM #TB WHERE T.UID=FID AND T.FID<>UID)
AND NOT EXISTS(SELECT 1 FROM #TB WHERE UID=T.FID AND FID=T.UID)
--3
select * from #TB T
WHERE EXISTS(SELECT 1 FROM #TB WHERE T.FID=UID AND T.UID<>FID)
AND NOT EXISTS(SELECT 1 FROM #TB WHERE UID=T.FID AND FID=T.UID)
/*
(所影响的行数为 7 行)

id Uid Fid Userimp Addtime
----------- ----------- ----------- ------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 100 101 2012-01-12 00:00:00.000 NULL
5 101 100 2012-01-13 00:00:00.000 NULL

(所影响的行数为 2 行)

id Uid Fid Userimp Addtime
----------- ----------- ----------- ------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 100 102 2012-01-12 00:00:00.000 NULL
3 100 103 2012-01-12 00:00:00.000 NULL
4 100 104 2012-01-12 00:00:00.000 NULL
6 101 102 2012-01-13 00:00:00.000 NULL

(所影响的行数为 4 行)

id Uid Fid Userimp Addtime
----------- ----------- ----------- ------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7 105 101 2012-01-14 00:00:00.000 NULL

(所影响的行数为 1 行)

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧