正确的SQL查询,用于访问用户可用的组

时间:2014-04-24 13:19:13

标签: php mysql sql

我有一系列表格按以下方式设置(为便于阅读,它们已被简化):

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关系选择可用于特定用户的可用聊天组。

我通常很喜欢加入等等,但是这个让我很难过。我一直让所有团体都回来了!

3 个答案:

答案 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 = ?

调整此选项以适合您想要返回的数据。如果需要按用户名分隔,请为用户表添加另一个连接