Как получить отдельные теги из столбца TAGS?

У меня есть следующая таблица в базе данных MySQL:

id    creation_date                         score     tags
1     2016-02-09 07:24:59.097000+00:00      -1        html|javascript
2     2016-02-09 08:10:00.000000+00:00      0         xml|css
3     2016-02-10 08:00:15.000000+00:00      2         html|javascript
4     2016-02-11 07:00:45.000000+00:00      -5        html|css

Я хочу получить теги и отсортировать их по очкам. Затем я хочу отсортировать теги по частоте отрицательных оценок, чтобы наихудшие теги отображались наверху.

Ожидаемый результат для вышеуказанного запроса будет:

TAG          FREQUENCY
html         2
css          1
javascript   1
xml          0

Я застреваю с извлечением отдельных тегов из столбцов.

SELECT tags, COUNT(*) 
FROM my_table 
WHERE score < 0
Как подсчитать вхождения в столбце, разделенном запятыми? в качестве отправной точки
Lukasz Szozda 01.09.2018 21:49

@LukaszSzozda: Запрос, представленный в принятом ответе, очень сложен и вообще не объясняется. Поэтому спасибо за ссылку, но жду, что кто-нибудь подробно объяснит, как решить мою задачу.

ScalaBoy 01.09.2018 21:52

Единственный верный ответ - изменить вашу схему на 3NF. Хранение тегов в формате CSV (с разделителями | -) - плохой дизайн.

Lukasz Szozda 01.09.2018 21:53

@ScalaBoy. . . Почему вы храните несколько значений в одном столбце? Это не способ хранения вещей в SQL. В SQL есть отличные способы хранения списков - он называется таблицей, а не строковым столбцом.

Gordon Linoff 01.09.2018 21:55

@GordonLinoff: Вот как данные хранятся в Kaggle (kaggle.com/stackoverflow/stackoverflow). Взгляните на таблицу post_questions. Так что этот вопрос не следует адресовать мне :)

ScalaBoy 01.09.2018 21:57
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда вы застряли с таким ужасным форматом данных, вы можете что-то с ним сделать. Таблица чисел может помочь, но вот пример, который извлечет до первых трех элементов:

select substring_index(substring_index(tags, '|', n.n), '|', -1) as tag, count(*)
from (select 1 as n union all
      select 2 as n union all
      select 3 as n
     ) n join
     t
     on n.n <= length(tags) - length(replace(t.tags, '|', '')) + 1
group by tag;

Что это делает? Предложение on гарантирует, что в строке есть как минимум теги n для заданного значения n (большие значения отфильтровываются).

Две функции substring_index() извлекают n-й тег из списка. А еще есть агрегация.

Что будет, если будет 4 тега? Будет ли он обрабатывать 3-й и 4-й теги как один тег?

ScalaBoy 01.09.2018 22:22

Вам необходимо расширить подзапрос n для обработки максимального количества тегов.

Gordon Linoff 01.09.2018 22:25

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