我有一张桌子,上面有我用户的帖子。每个帖子只是一个文本字段,一个帖子可以包含标签,例如:
"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是帖子文本的一部分。
答案 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查询计划中如何处理内联视图。