Как я могу получить количество вхождений в предложении SQL IN? - PullRequest
0 голосов
/ 28 августа 2008

Допустим, у меня есть четыре таблицы: 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

Цитировать Neall

Ваш вопрос немного сбивает с толку. Хотите узнать, сколько раз каждая страница была помечена?

нет

Нет

Сколько раз каждая страница получала каждый тег?

нет

Нет

Количество уникальных пользователей, которые отметили страницу?

Нет

Количество уникальных пользователей, которые отметили каждую страницу каждым тегом?

нет

Нет

Я хочу знать, сколько переданных тегов появятся на конкретной странице, а не только, если появятся какие-либо из тегов.

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' 

@ Эдуардо Молтени Ваш ответ не дает вывод в вопросе, но:

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.

Есть еще идеи?

Ответы [ 6 ]

2 голосов
/ 28 августа 2008

Это может сработать:

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)
1 голос
/ 28 августа 2008

ОК, поэтому ключевое различие между этим и ответом Кристофа состоит в том, что вы хотите, чтобы счетчик 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.

0 голосов
/ 28 августа 2008

Ответ Ли Колдуэлла правильный, спасибо, но нужно добавить псевдоним хотя бы в 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
0 голосов
/ 28 августа 2008
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

Это дает вам количество тегов на каждой странице; упорядочено по большему количеству тегов

Надеюсь, я правильно понял ваш вопрос

0 голосов
/ 28 августа 2008

Согласен с 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

Но если вы хотите, чтобы тэг-счет, Дарен ответил на ваш вопрос

0 голосов
/ 28 августа 2008

В T-Sql:

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

Это подсчитает количество различных имен тегов для вашего списка идентификаторов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...