如何获得SQL IN子句中的出现次数?
假设我有四个表:" PAGE"," USER"," TAG"和" PAGE-TAG":
Table | Fields ------------------------------------------ PAGE | ID, CONTENT TAG | ID, NAME USER | ID, NAME PAGE-TAG | ID, PAGE-ID, TAG-ID, USER-ID
假设我有四个页面:
PAGE#1 'Content page 1' tagged with tag#1 by user1, tagged with tag#1 by user2 PAGE#2 'Content page 2' tagged with tag#3 by user2, tagged by tag#1 by user2, tagged by tag#8 by user1 PAGE#3 'Content page 3' tagged with tag#7 by user#1 PAGE#4 'Content page 4' tagged with tag#1 by user1, tagged with tag#8 by user1
我希望我的查询看起来像这样:
select page.content ? from page, page-tag where page.id = page-tag.pag-id and page-tag.tag-id in (1, 3, 8) order by ? desc
我想要这样的输出:
Content page 2, 3 Content page 4, 2 Content page 1, 1
引用尼尔
Your question is a bit confusing. Do you want to get the number of times each page has been tagged?
不
The number of times each page has gotten each tag?
不
The number of unique users that have tagged a page?
不
The number of unique users that have tagged each page with each tag?
不
我想知道在特定页面中出现了多少个通过的标签,而不仅仅是出现了任何标签。
SQL IN的工作方式类似于布尔运算符OR。如果页面在IN子句中标记有任何值,则它将返回true。我想知道IN子句中有多少个值返回true。
在我下面显示的是我期望的输出:
page 1 | in (1,2) -> 1 page 1 | in (1,2,3) -> 1 page 1 | in (1) -> 1 page 1 | in (1,3,8) -> 1 page 2 | in (1,2) -> 1 page 2 | in (1,2,3) -> 2 page 2 | in (1) -> 1 page 2 | in (1,3,8) -> 3 page 4 | in (1,2,3) -> 1 page 4 | in (1,2,3) -> 1 page 4 | in (1) -> 1 page 4 | in (1,3,8) -> 2
这将是我之前提到的页面标签表的内容:
id page-id tag-id user-id 1 1 1 1 2 1 1 2 3 2 3 2 4 2 1 2 5 2 8 1 6 3 7 1 7 4 1 1 8 4 8 1
@Kristof并不完全是我要搜索的内容,但是无论如何还是要感谢。
@Daren如果我执行代码,则会出现下一个错误:
#1054 - Unknown column 'page-tag.tag-id' in 'having clause'
@Eduardo Molteni答案没有给出问题的输出,但:
Content page 2 8 Content page 4 8 content page 2 3 content page 1 1 content page 1 1 content page 2 1 cotnent page 4 1
@Keith我使用的不是T-SQL的纯SQL,也不熟悉T-SQL,所以我不知道查询如何转换为纯SQL。
还有其他想法吗?
解决方案
回答
这可能起作用:
select page.content, count(page-tag.tag-id) as tagcount from page inner join page-tag on page-tag.page-id = page.id group by page.content having page-tag.tag-id in (1, 3, 8)
回答
在T-Sql中:
select count(distinct name) from page-tag where tag-id in (1, 3, 8)
这将为我们提供ID列表中不同标签名称的数量计数
回答
同意Neall,这个问题有点令人困惑。
如果要在问题中列出输出,则sql很简单:
select page.content, page-tag.tag-id from page, page-tag where page.id = page-tag.pag-id and page-tag.tag-id in (1, 3, 8) order by page-tag.tag-id desc
但是,如果我们想获得标签数量,达伦回答了问题
回答
select page.content, count(pageTag.tagID) as tagCount from page inner join pageTag on page.ID = pageTag.pageID where pageTag.tagID in (1, 3, 8) group by page.content order by tagCount desc
这样就可以为我们提供每页标签的数量;按较高数量的标签排序
我希望我能正确理解你的问题
回答
好的,因此此答案与kristof答案之间的主要区别在于,我们只希望针对第1页显示1计数,因为它仅用集合中的一个标记进行了标记(即使两个单独的用户都对其进行了标记)。
我建议这样做:
SELECT page.ID, page.content, count(*) AS uniquetags FROM ( SELECT DISTINCT page.content, page.ID, page-tag.tag-id FROM page INNER JOIN page-tag ON page.ID=page-tag.page-ID WHERE page-tag.tag-id IN (1, 3, 8) ) GROUP BY page.ID
我没有安装SQL Server进行检查,因此如果语法错误,我深表歉意。但是从语义上来说,我认为这是我们所需要的。
这可能不会以标签数量的降序给出输出,但是请尝试添加:
ORDER BY uniquetags DESC
在最后。我的不确定性是我们是否可以在SQL Server中的分组之外使用ORDER BY
。如果没有,那么我们可能需要将整个东西嵌套在另一个" SELECT"中。
回答
Leigh Caldwell的答案是正确的,谢谢,但是至少在MySQL中需要添加一个别名。因此查询将如下所示:
SELECT page.ID, page.content, count(*) AS uniquetags FROM ( SELECT DISTINCT page.content, page.ID, page-tag.tag-id FROM page INNER JOIN page-tag ON page.ID=page-tag.page-ID WHERE page-tag.tag-id IN (1, 3, 8) ) as page GROUP BY page.ID order by uniquetags desc