SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.05.2022 17:17:21

NVB
Участник
Зарегистрирован: 16.05.2022
Сообщений: 5

Подсчет тэгов для каждой записи

Помогите, пожалуйста, составить запрос.

Есть таблица table из двух столбцов
id_text (это id статьи)
id_tag (это id тэга к статье).

К одной статье может быть до 4 тэгов, т.е. таблица для примера может выглядеть так:
id_text | id_tag
1         | 1
1         | 3
2         | 4
3         | 1
3         | 2
3         | 3
3         | 4

Нужно выбрать 5 статей с наибольшим количеством тэгов и вывести в убывающем порядке, указывая для каждой статьи количество имеющихся для нее тэгов. Вот так это должно выглядеть для примера:

Название статьи | Общее кол-во тэгов | Кол-во каждого тэга

Статья 5             | 100                        |  Тэг1 (50 шт.), Тэг2 (30 шт.), Тэг4(20 шт.)
Статья 1             | 85                          | Тэг2 (40 шт.), Тэг3 (35 шт.), Тэг5 (10 шт.)
Статья 3             | 72                          | Тэг3 (72 шт.)
Статья 2             | 14                          | Тэг5 (10 шт.), Тэг6 (4 шт.)
Статья 4             | 5                            | Тэг1 (5 шт.)

Даже не знаю, с какой стороны подступится.

Неактивен

 

#2 16.05.2022 22:20:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подсчет тэгов для каждой записи

Попробуйте начать с

SELECT a.name, count(*) co FROM article a INNER JOIN tags t ON a.id = t.id_text GROUP BY a.id ORDER by co DESC;


article - таблица статей (в ней два поля: id - номер статьи и name - название статьи), связываем её с таблицей связей tags.
Это выдаст заголовки статей и количество тегов в них.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Активен

 

#3 17.05.2022 08:43:12

NVB
Участник
Зарегистрирован: 16.05.2022
Сообщений: 5

Re: Подсчет тэгов для каждой записи

deadka, сделал. Выдает заголовки и общее количество для каждого заголовка. Код ниже.
А что сюда добавить, чтобы для каждого заголовка (poster) помимо общего кол-ва тэгов (reactions) у нее выводилось количество каждого тэга (reaction)?

SELECT pu.username poster,
count(poster_id) co
FROM phpbb_reactions pr LEFT JOIN phpbb_users pu ON pr.poster_id=pu.user_id
GROUP BY pr.poster_id
ORDER BY co DESC
LIMIT 100

Отредактированно NVB (17.05.2022 08:44:54)

Неактивен

 

#4 17.05.2022 14:37:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчет тэгов для каждой записи

Т.е. теги для статьи могут дублироваться?
Приведите пример тестовых данных и результат для этих данных. А то пример из первого поста

К одной статье может быть до 4 тэгов,

только запутывает

Неактивен

 

#5 17.05.2022 16:49:17

NVB
Участник
Зарегистрирован: 16.05.2022
Сообщений: 5

Re: Подсчет тэгов для каждой записи

Да, что-то я со вводной намудрил.
Давайте еще раз.
Есть форум.
Пользователи форума - в таблице user 


user_id |  user_name
1          |  Анна
2          |  Николай
3          |  Михаил
 


На форуме есть система оценок постов - в таблице reaction.

reaction_id | reaction_name
L               | Лайк
D              | Дизлайк
 


Все оценки (reaction) постов записываются в таблицу - user_reaction (user_id - кого пост оценили, user_id_2 - кто пост оценил, reaction_id - идент. оценки, post_id - идент. поста).
Конечно же, оценки могут повторятся - за разные посты, от разных оценщиков.

user_id |  user_id_2 | reaction_id | post_id
1          |                 | L
2          |                 | D
1          |                 | D
2          |                 | L
2          |                 | D
2          |                 | D
2          |                 | L
1          |                 | L
3          |                 | L
 


Нужно вывести список пользователей по количеству оценок (поставленных им), указывая также количество каждой конкретно оценки для каждого пользователя.
Т.е. для приведенных выше данных должен быть выведен такой перечень:

Пользователь  |  Всего оценок |  Оценок "Лайк"  |  Оценок "Дизлайк"
Николай          |  5                   |  2                      |  3
Анна               |  3                   |   2                     |   1
Михаил           |  1                   |   1                      |  0
 


Как должен выглядеть запрос для такого вывода?
Помогите, пожалуйста.
В сети что-то не смог ничего внятного найти на эту тему.

Отредактированно NVB (17.05.2022 16:51:26)

Неактивен

 

#6 17.05.2022 17:07:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчет тэгов для каждой записи

select user_id, count(*) as `всего оценок`, sum(if(reaction_id = 'L'),1,0) as `Оценок "Лайк" `,  sum(if(reaction_id = 'D'),1,0) as `Оценок "Дизлайк" ` from  user_reaction group by user_id

Неактивен

 

#7 18.05.2022 19:20:38

NVB
Участник
Зарегистрирован: 16.05.2022
Сообщений: 5

Re: Подсчет тэгов для каждой записи

Большое спасибо, vasya! Все заработало как надо!

Подскажите, пожалуйста, следующее.

1. Допустим у меня не 2 оценки в таблице reaction, как я указал в примере, а 20.
И все их придется вручную прописывать в запросе - sum(if(reaction_id = 'L'),1,0) as `Оценок "Лайк" ` и т.д. - ? Я правильно понимаю? Иначе никак?

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


Пользователь  |  Всего оценок |  Оценок "Лайк"  |  Оценок "Дизлайк"
Николай          |  5                   |  2                      |  3
Анна               |  3                   |   2                     |   1
Михаил           |  1                   |   1                      |  0
 

А как изменить запрос, что Вы привели в #6, чтобы для каждого количества выводился и тип оценки?
Т.е. к запросу надо как-то прицепить таблицу  reaction и получить оттуда название оценок reaction_name.
В итоге должно получиться:

Николай          |  5                   |  Лайк 2                      |  Дизлайк 3
Анна               |  3                   |   Лайк 2                     |   Дизлайк 1
Михаил           |  1                   |   Лайк 1                      |  Дизлайк 0
 

Отредактированно NVB (18.05.2022 19:21:42)

Неактивен

 

#8 18.05.2022 20:00:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчет тэгов для каждой записи

NVB написал:

1. Допустим у меня не 2 оценки в таблице reaction, как я указал в примере, а 20.
И все их придется вручную прописывать в запросе - sum(if(reaction_id = 'L'),1,0) as `Оценок "Лайк" ` и т.д. - ? Я правильно понимаю? Иначе никак?

Да.


NVB написал:

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


Пользователь  |  Всего оценок |  Оценок "Лайк"  |  Оценок "Дизлайк"
Николай          |  5                   |  2                      |  3
Анна               |  3                   |   2                     |   1
Михаил           |  1                   |   1                      |  0
 

А как изменить запрос, что Вы привели в #6, чтобы для каждого количества выводился и тип оценки?
Т.е. к запросу надо как-то прицепить таблицу  reaction и получить оттуда название оценок reaction_name.
В итоге должно получиться:

Николай          |  5                   |  Лайк 2                      |  Дизлайк 3
Анна               |  3                   |   Лайк 2                     |   Дизлайк 1
Михаил           |  1                   |   Лайк 1                      |  Дизлайк 0
 

можно вместо
sum(if(reaction_id = 'L'),1,0)
использовать
concat('Лайк ',sum(if(reaction_id = 'L'),1,0))

Неактивен

 

#9 18.05.2022 21:24:24

NVB
Участник
Зарегистрирован: 16.05.2022
Сообщений: 5

Re: Подсчет тэгов для каждой записи

Спасибо, vasya!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson