对于糟糕的标题感到抱歉 - 如果有人想要更改一些不言自明的东西,很棒 - 我不知道如何表达问题。这是:
我有一张这样的表:
POST_ID (INT) TAG_NAME (VARCHAR)
1 'tag1'
1 'tag2'
1 'tag3'
2 'tag2'
2 'tag4'
....
我想要做的是计算同时包含tag1和tag2的POST数量
我已经搞乱了GROUP BY和DISTINCT以及COUNT但是我无法构造一个可以解决问题的查询。
有什么建议吗?
编辑:在伪sql中,我想要的查询是:
SELECT DISTINCT(POST_ID) WHICH HAS TAG_NAME = 'tag1' AND TAG_NAME = 'tag2';
由于
答案 0 :(得分:2)
Posts
。加入桌子对抗自己:
SELECT * FROM Posts P1
JOIN Posts P2
ON P1.POST_ID = P2.POST_ID
WHERE P1.TAG_NAME = 'tag1'
AND P2.TAG_NAME = 'tag2'
答案 1 :(得分:0)
尝试以下查询:
SELECT COUNT(*) nb_posts FROM ( SELECT post_id, COUNT(*) nb_tags FROM table WHERE tag_name in ('tag1','tag2') GROUP BY post_id HAVING COUNT(*) = 2 ) t
修改:根据Konerak的回答,以下是当给定帖子有重复的标记名称时处理案例的查询:
SELECT DISTINCT t1.post_id FROM table t1 JOIN table t2 ON t1.post_id = t2.post_id AND t2.tag_name = 'tag2' WHERE t1.tag_name = 'tag1'
答案 2 :(得分:0)
我只是将这个(未经测试的)从属子查询解决方案留在这里作为参考,即使它在进入大型数据集时可能会非常慢。应该选择任何使用连接执行相同操作的解决方案。
假设您的posts
表格中包含id
字段:
SELECT count(*) FROM posts WHERE EXISTS(SELECT NULL FROM posts_tags WHERE tag = 'tag1' AND post_id = posts.id) AND EXISTS(SELECT NULL FROM posts_tags WHERE tag = 'tag2' AND post_id = posts.id)