Mysql 基于从其他表中选择的ID,使用字段值计算其他表中的行数

Mysql 基于从其他表中选择的ID,使用字段值计算其他表中的行数,mysql,sql,Mysql,Sql,我有以下表格: 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 {
    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\u文件夹
表中选择记录,但是我想为特定的
用户id
conversation\u用户
表中的
所有者用户id
)包括文件夹中未读取的对话数

这是一个查询可以实现的,还是我必须获取文件夹,然后运行另一个查询来获取未读计数

编辑:

为了提高显著性,此查询提供了所需的结果,但它涉及多个子查询,这远远不够理想:

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

分别查询两者可能是最好的。这也可以通过对user\u id和owner\u user\u 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;

这需要
@user\u id
参与您模型的所有对话。否则,您将需要一个
左连接
,但您的问题并没有说明这一点


我假设您为每个用户创建对话id,并在每次创建新对话时将is_unread设置为true。

一些示例表数据和预期结果会很好。下面是一个使用SqlFIDLE nice place启动的示例,但仍然远离OP问题。您好,这没有提供正确的数据,请参阅我的编辑。让我检查一下,但您应该遵循jarlh并提供一些数据样本和期望输出。
 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