我有以下表格:
conversation_folder {
conversation_folder_id,
user_id
...
}
conversation_user {
conversation_id
owner_user_id
is_unread
}
conversation_folder_relations {
conversation_id
conversation_folder_id
user_id
}
我想要从conversation_folder
表格中选择记录,但是我想包括特定user_id
的未读取文件夹中的对话数量( owner_user_id
表中的conversation_user
。
这可能是一个查询,还是我必须获取文件夹,然后运行另一个查询以获取未读数?
编辑:
为了增加显而易见性,此查询提供了所需的结果,但它涉及多个子查询,这远非理想:
SELECT conversation_folder.*,
(
SELECT COUNT(conversation_id)
FROM conversation_user
WHERE conversation_id IN (
SELECT conversation_id
FROM conversation_folder_relations
WHERE conversation_folder_relations.user_id = conversation_user.owner_user_id
AND conversation_folder_id = conversation_folder.conversation_folder_id
)
AND is_unread = 1
) AS unread_count
FROM conversation_folder
WHERE conversation_folder.user_id = ?
答案 0 :(得分:0)
分别查询两者可能是最好的。这也可以通过列user_id和owner_user_id的连接来解决,然后对结果表进行计数。但是,如果在SqlServer上使用不当,加入对于性能来说是非常糟糕的,也许MySql是不同的。这是未经测试的,因为我只使用过SqlServer。
SELECT count(conversation_id)
FROM conversation_user
INNER JOIN conversation_folder_relations
ON conversation_user.owner_user_id = conversation_folder_relations.user_id;
答案 1 :(得分:0)
SELECT conversation_folder_id, count(conversation_id)
FROM conversation_user cu
JOIN conversation_folder_relations cfr
ON cu.conversation_id = cfr.conversation_id
WHERE
cu.owner_user_id = @user_id
AND is_unread = true
GROUP BY conversation_folder_id
此需求@user_id
位于您模型的所有conversation_id中。否则你需要一个LEFT JOIN
,但你的问题没有说明。
我假设您为每个用户创建了conversation_id,并在每次创建新会话时将is_unread设置为true。