如何使用左连接和最大操作计算查询产生的行数?

时间:2014-03-12 13:12:33

标签: mysql database

首先,我有这个帖子表。每个帖子可以有0个或更多标签。标签有自己的读取权限(数字)。

为了说明,我有3个表:帖子,TagRel和标签。

Posts: post_id, post_title, post_body
Tags: tag_id, tag_name, tag_perm
TagRel: post_id, tag_id

-----------------------------------------------------
post_id   |    post_title     |     post_body
-----------------------------------------------------
0         | Sample Title      | Sample Body
1         | Sample Title 1    | Sample Body
2         | Sample Title 2    | Sample Body
-----------------------------------------------------

-----------------------------------------------------
tag_id   |    tag_name     |     tag_perm
-----------------------------------------------------
1        | Top Secret      | 90
2        | General         | 0
-----------------------------------------------------

-----------------------------------------------------
tag_id   |   post_id
-----------------------------------------------------
1        |    1
-----------------------------------------------------

我需要做的是计算有tag_perm< = N的帖子。这也应该包含没有标签的帖子,因为这意味着这些帖子可以阅读。

假设N为0,我们需要计算既没有标签也有标签的帖子< = 0 tag_perm。从我们的插图中,它应该返回2.

这是我选择2个帖子的查询:

SELECT p.*,
(CASE WHEN MAX(t.tag_perm) IS NULL THEN 0 ELSE MAX(t.tag_perm) END) as read_perm 
FROM tbl_posts p 
LEFT JOIN tbl_tagrel r ON r.post_id = p.post_id 
LEFT JOIN tbl_tags t ON t.tag_id = r.tag_id 
GROUP BY p.post_id 
HAVING read_perm <= N

我在计算时遇到问题,这就是我所得到的,但它仍然没有产生预期的结果。

SELECT COUNT(DISTINCT p.post_id) 
FROM tbl_posts p 
LEFT JOIN tbl_tagrel r ON r.post_id = p.post_id 
LEFT JOIN tbl_tags t ON t.tag_id = r.tag_id 

1 个答案:

答案 0 :(得分:2)

由于您的第一个查询返回正确的行数,因此将其用作子查询并对其进行计数:

SELECT COUNT(*)
FROM (
    SELECT p.post_id,
        (CASE WHEN MAX(t.tag_perm) IS NULL THEN 0 ELSE MAX(t.tag_perm) END) as read_perm, 
    FROM tbl_posts p 
    LEFT JOIN tbl_tagrel r ON r.post_id = p.post_id 
    LEFT JOIN tbl_tags t ON t.tag_id = r.tag_id 
    GROUP BY p.post_id 
    HAVING read_perm <= N
    ) sub