如何获得SQL IN子句中的出现次数?

时间:2020-03-05 18:44:19  来源:igfitidea点击:

假设我有四个表:" 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