我有一系列表格按以下方式设置(为便于阅读,它们已被简化):
user
- id
- name
user_has_oi_relationship
- user_id
- oi_relationship_id
oi_relationship
- id
- description
chat_group_has_oi_relationship
- chat_group_id
- oi_relationship_id
chat_group
- id
- name
- description
'user'表中的每个条目都附加了一系列OI关系,如'user_has_oi_relationship'表中所定义。每个聊天组还附加了一系列OI关系,如“chat_group_has_oi_relationship”表中所定义。
我想要做的是根据用户ID根据他们的OI关系选择可用于特定用户的可用聊天组。
我通常很喜欢加入等等,但是这个让我很难过。我一直让所有团体都回来了!
答案 0 :(得分:3)
好的,让我们从用户的user_has_oi_relationship开始:
--query 1
select oi_relationship_id from user_has_oi_relationship where user_id =:user_id
现在转到有oi
的chat_groups--query 2
select chat_group_id from chat_group_has_oi_relationship
where oi_relationship_id in (
--query 1
select oi_relationship_id from user_has_oi_relationship where user_id =:user_id
)
最后得到小组的名字:
select id, name from chat_group
where id in (
--query 2
select chat_group_id from chat_group_has_oi_relationship
where oi_relationship_id in (
--query 1
select oi_relationship_id from user_has_oi_relationship where user_id =:user_id
)
)
sql语句的可读性很重要,因此您应该按照自己的方式编写它们。数据库很聪明地将这些查询优化为可以快速运行的东西。只有当它开始成为性能瓶颈时,你才需要“考虑重写”。
BTW,感谢您缩短问题的数据库结构。
答案 1 :(得分:1)
我认为应该这样做:
SELECT cg.*
FROM chat_group AS cg
JOIN chat_group_has_oi_relationship AS cgr ON cg.id = cgr.chat_group_id
JOIN user_has_oi_relationship AS ur ON ur.oi_relationship_id = cgr.oi_relationship_id
JOIN user AS u ON ur.user_id = u.id
WHERE u.name = 'John Smith'
如果没有,请提供一个包含样本数据的方式。
答案 2 :(得分:0)
Select cg.name, cg.description FROM chat_group cg
INNER JOIN chat_group_has_oi_relationship coir
ON cg.id = coir.chat_group_id
INNER JOIN user_has_oi_relationship uoir
ON coir.oi_relationship_id = uoir.oi_relationship_id
WHERE uoir.user_id = ?
调整此选项以适合您想要返回的数据。如果需要按用户名分隔,请为用户表添加另一个连接