在双向关系表中获取唯一的朋友关系

时间:2016-09-17 08:54:53

标签: mysql sql

我的友谊表有以下数据库结构:

Retrofit.Builder builder = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory
                        .create(
                                new GsonBuilder()
                                        .registerTypeAdapter(
                                                JSONObject.class,
                                                new JsonObjectDeserializer()
                                        )
                                        .create()));

我有这个维护项目,它使用上述结构来存储友谊。以下是案例:

  1. 25和32是朋友,因为他们有记录(id 1,2)并在行动栏中完成

  2. 用户85向50发送请求(身份证号码为3),但50人未接受行动,现在不接受'

  3. 用户52未根据用户18

  4. 的请求采取任何行动


    • 现在我希望从上面的结构中获得所有独特的完整关系(当两个用户都已完成操作时)。因此,25和32之间的关系应该只显示一次。
    • 未响应请求或采取操作的所有用户friends ------- id | user_id | friend_id | action 1 25 32 done 2 32 25 done 3 85 50 done 4 50 85 not now 5 18 52 done

    由于这是一个维护项目,我无法真正改变结构,因此必须解决这个问题。

3 个答案:

答案 0 :(得分:0)

您可以加入两个子查询,一个用于关系的每一侧。为了确保您没有得到重复的答案,您可以让一个子查询句柄list小于user_id,另一个处理相反的方式:

friend_id

答案 1 :(得分:0)

要查找所有已完成的友谊,请将表连接到自身匹配的反向关系:

select a.user_id, a.friend_id
from friendships a
join friendships b on b.user_id = a.friend_id
  and b.friend_id = a.user_id
  and b.action = 'done'
where a.user_id < a.friend_id
and a.action = 'done'

where子句通过仅选择user_id小于friend_id的行来确保您只获得一次关系。

答案 2 :(得分:0)

试试第一个问题:

 SELECT a.user_id, a.friend_id, a.action
 FROM friends a
 INNER JOIN friends b ON a.friend_id = b.user_id
 WHERE a.action = 'done' AND b.action = 'done'
 AND a.user_id < b.user_id

- 二

 SELECT a.user_id, a.friend_id, a.action
 FROM friends  a
 LEFT JOIN friends b ON a.friend_id = b.user_id
 WHERE a.action = 'done' 
 AND (b.action <> 'done' OR b.user_id IS NULL)