根据从另一个表中选择的ID计算其他表中的行数和字段值

时间:2015-11-06 14:55:08

标签: 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表格中选择记录,但是我想包括特定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 = ?

2 个答案:

答案 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;

http://www.w3schools.com/sql/sql_join_inner.asp

答案 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。