Мы могли бы сделать что-то вроде этого:
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.