求助,关于好友关系的Sql查询!

Zee 发布于 2011/07/15 00:21
阅读 468
收藏 1
高手帮我看看这样的sql语句该怎么写?

我一个关于好友的关系的表
一个用户表Person
保存用户的基本信息,有用户id,还有一些其它的信息
另外一个表Friends
保存用户之间的关系三个,id,字段 userid 和 friendid 
比如,用户表中有用户 A,B,C  
如果用户A 加用户B为好友就是在表Friends中加入一条记录
 
id  userid      friendid  
 1    A           B     表示A的好友列表中有B,但这个时候B的好友列表中并没有A

 2    A           C     表示A的好友列表中有C,但这个时候B的好友列表中并没有C
 3    C           A     表示C的好友列表中有A,所以这时A的好友中有C,C的好友中也有A

我想查询A 和 B之间这种只有单相关系的内容,即 A的好友中有B,但 B的好友列表中并没有A的记录
结果: A       B  
加载中
0
mark35
mark35

给个求双向关系的笨办法:

SELECT DISTINCT f1.id  FROM friends f1, friends f2
  WHERE f1.userid = f2.friendid AND f1.friendid = f2.userid

求得双向关系后减去它就是单向的了~

 

 

0
Zee
Zee

非常感谢mark35同学的帮助!最终我的代码是这样的:

表结构:Friends , 

     字段id,

      flag, --分组标记

      myself, --用户的id   用户表与它1对多的关系

      friend ,-- 用户的好友id    用户表与它1对多的关系

HQL如下:

                 StringBuffer hql = new StringBuffer();

 hql.append("select f from Friends f where f.friend.id = ? and f.id not in ");

 hql.append("(select DISTINCT f1.id FROM Friends f1, Friends f2 ");

 hql.append("WHERE f1.myself.id = f2.friend.id and f1.friend.id = f2.myself.id)");

  return getHibernateTemplate().find(hql.toString(),userId);

执行生成的SQL语句如下:

        select

        friends0_.id as id8_,

        friends0_.flag as flag8_,

        friends0_.friend as friend8_,

        friends0_.myself as myself8_ 

    from

        Friends friends0_ 

    where

        friends0_.friend=? 

        and (

            friends0_.id not in  (

                select

                    distinct friends1_.id 

                from

                    Friends friends1_,

                    Friends friends2_ 

                where

                    friends1_.myself=friends2_.friend 

                    and friends1_.friend=friends2_.myself

            )

        )

 

这样的结果已经没有问题是正确的

不知道还有没有更高效的写法呢?

 

返回顶部
顶部