MySQL: количество тегов в текстовых полях (сообщения пользователей) - PullRequest
0 голосов
/ 29 мая 2019

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

"Hello this is my first post and I am in #japan enjoying #tokio How are you doing?"

Я хотел бы написать запрос MySQL, который прошел бы через всю таблицу и вернул бы самые популярные теги с nr вхождений, отсортированных по количеству, например:

#travel 53
#japan 14
#food 13
#tokio 6
#selfie 4
etc.

Обратите внимание, что у меня нет отдельной таблицы для тегов. Все, что у меня есть, это одна таблица с сообщениями, а #tags являются частью текста сообщения.

1 Ответ

0 голосов
/ 29 мая 2019

Мы могли бы сделать что-то вроде этого:

SELECT v.tag
     , COUNT(1) AS cnt
  FROM ( SELECT CONCAT('#',IF(t.foo=SUBSTRING_INDEX(t.foo,'#',i.n*-1),NULL,SUBSTRING_INDEX(SUBSTRING_INDEX(t.foo,'#',i.n*-1),' ',1))) AS tag
           FROM ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 
                  UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
                  UNION ALL SELECT 11 UNION ALL SELECT 12
                 ) i
           CROSS
            JOIN ( SELECT 'Hello this is my first post and I am in #japan enjoying #tokio How are you doing?' AS foo 
                   UNION ALL SELECT '#japan #rocks' 
                   UNION ALL SELECT 'a # b ## c ##'
                 ) t
         HAVING tag IS NOT NULL
       ) v
 GROUP BY v.tag
 ORDER BY cnt DESC, v.tag ASC

Встроенное представление i необходимо расширить на 13, 14, 15, ... до максимально возможного числа тегов, которые могут появиться вpost.

Встроенное представление t предоставляет несколько примеров строк в качестве демонстрации.Встроенное представление должно быть заменено ссылкой на таблицу.

Нам также нужно указать, что следует возвращать, когда в сообщении встречаются строки типа # и ###.(Это допустимые теги? Должны ли они быть подсчитаны?)


FOLLOWUP

Q: "Можете ли вы написать рабочий запрос, если моя таблица [имя] users_posts и поле [имя столбца] равно post_text?

A: Это уже ответило на заданный вопрос, предоставив образец шаблона запроса. В исходном вопросе не было таблицыимя или имя столбца, поэтому в этом ответе предполагалось, что OP сможет следовать предоставленному шаблону и написать собственный запрос (StackOverflow - это сайт вопросов / ответов, а не служба написания кода).

В SQLссылку на таблицу можно заменить встроенным представлением.

Например, предположим, что у нас есть таблица с именем user_posts, которая включает столбец с символьным типом с именем post_text. И предположим, у нас есть такой запрос:

  SELECT t.`post_text`
    FROM `user_posts` t

Мы могли бы заменить ссылку на таблицу (user_posts) на запрос, который возвращает набор результатов, например:

  SELECT t.`post_text`
    FROM (
           SELECT 'Hi I''m in #tokio #japan' AS `post_text`
           UNION ALL SELECT '#hanoi #rocks'
           UNION ALL SELECT 'a # b ## c ##'
           UNION ALL SELECT ''
         ) t

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

Запрос, который заменяет ссылку на таблицу, называется "встроенный вид ".MySQL называет это «производной таблицей», главным образом из-за того, как встроенное представление обрабатывается в плане запросов MySQL.

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