1

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

引用尼尔

你的问题有点令人困惑。您想获取每个页面被标记的次数吗?

每个页面获得每个标签的次数?

标记页面的唯一用户数?

使用每个标签标记每个页面的唯一用户数?

我想知道有多少传递的标签出现在特定页面中,而不仅仅是出现任何标签。

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

这将是我之前提到的 page-tag 表的内容:

   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我使用的是纯SQL而不是T-SQL,而且我不熟悉T-SQL,所以我不知道您的查询如何转换为纯SQL。

还有什么想法吗?

4

6 回答 6

2

这可能有效:

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)
于 2008-08-28T12:24:09.877 回答
1

好的,所以这与 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

在末尾。我不确定是否可以ORDER BY在 SQL Server 中使用分组之外的功能。如果没有,那么您可能需要将整个内容嵌套在另一个SELECT.

于 2008-08-28T15:19:27.257 回答
0

在 T-Sql 中:

select count(distinct name)
from page-tag
where tag-id in (1, 3, 8) 

这将为您计算 id 列表中不同标签名称的数量

于 2008-08-28T12:32:46.423 回答
0

同意尼尔的观点,这个问题有点令人困惑。如果您想要问题中列出的输出,则 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

但是如果你想要tagcount,达伦回答了你的问题

于 2008-08-28T12:37:43.087 回答
0
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

这为您提供了每页的标签数量;按更多标签排序

我希望我正确理解了你的问题

于 2008-08-28T12:58:37.750 回答
0

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
于 2008-08-28T15:57:35.120 回答