我的友谊表有以下数据库结构:
Retrofit.Builder builder = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory
.create(
new GsonBuilder()
.registerTypeAdapter(
JSONObject.class,
new JsonObjectDeserializer()
)
.create()));
我有这个维护项目,它使用上述结构来存储友谊。以下是案例:
25和32是朋友,因为他们有记录(id 1,2)并在行动栏中完成
用户85向50发送请求(身份证号码为3),但50人未接受行动,现在不接受'
用户52未根据用户18
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
。由于这是一个维护项目,我无法真正改变结构,因此必须解决这个问题。
答案 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)