Как я могу узнать количество вхождений в предложении 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 работает как логический оператор ИЛИ. Если страница была помечена каким-либо значением в предложении IN, она возвращает true. Я хотел бы знать, сколько значений внутри предложения IN возвращают истину.

Ниже я показываю ожидаемый результат:

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 не совсем то, что я ищу, но все равно спасибо.

@ Дарен Если я выполню ваш код, я получу следующую ошибку:

#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.

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
4 421
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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) 

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

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

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

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

Ответ принят как подходящий

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

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

Другие вопросы по теме