MySQL:在文本字段(用户的帖子)中计算#tags

时间:2019-05-29 19:49:34

标签: mysql tags

我有一张桌子,上面有我用户的帖子。每个帖子只是一个文本字段,一个帖子可以包含标签,例如:

"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 :(得分:0)

我们可以做这样的事情:

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 ...,直到帖子中可以显示的最大标签数。

内联视图t提供了一些示例行作为演示。内联视图应替换为表引用。

我们还需要指定在帖子中遇到####之类的字符串时应返回的内容。 (这些标签有效吗?应该计数吗?)


关注

问:“如果我的表[名称]为users_posts并且字段 [列名称]为post_text,您可以编写工作查询吗?

A:这已经回答了所提出的问题,并提供了示例查询模式。最初的问题没有提供表名或列名,因此该答案假定OP可以按照提供的模式编写自己的查询。 (StackOverflow是一个Question / Answer网站,而不是代码编写服务。)

在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

不是我们可以单独运行该内部查询standalong,并使其返回结果集。当我们将其包装在parens中并将其放入外部查询的FROM子句中时,该查询的结果是外部查询的行源。

替换表引用的查询称为“内联视图”。 MySQL之所以称其为“派生表”,主要是因为在MySQL查询计划中如何处理内联视图。