2015-11-06 50 views
0

我有以下表格:计数数量

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_idconversation_user表中的owner_user_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 = ? 
+0

一些样品表数据和预期的结果会很好。 – jarlh

+0

这里是一个使用sqlfiddle http://sqlfiddle.com/#!9/18cc8/7 –

回答

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

+0

的好例子,但是离OP问题还很远。 –

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。

+0

嗨,这不提供正确的数据,请参阅我的编辑。 –

+0

让我检查,但你应该遵循jarlh并提供一些数据样本和欲望输出。 –