首先,我有这个帖子表。每个帖子可以有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
答案 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