1

我的表上有一个逗号分隔的字段,它存储如下标签:

avengers, heroes, marvel, 2012, hulk, captain america

我想获得最常用的标签。

如何在一个 SELECT 查询上执行此操作?

4

2 回答 2

1

你不能——一方面,MySQL 不提供拆分字符串的功能。您需要规范化您的数据以在纯 SQL 中实现这一点。

于 2012-11-07T17:43:36.933 回答
0

五年过去了。不过,有一种方法可以做到这一点。您实际上可以从 MySQL 中以逗号分隔的术语列表中提取单个“术语”。这是令人难以置信的讨厌,它需要知道将出现在任何行中的最大术语数。SUBSTRING_INDEX() 函数是它的关键。

假设您在一个字段中的术语永远不会超过五个。然后,此查询会获取您的所有术语,并将它们从最频繁到最少排序。

SELECT COUNT(*), term FROM(
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',1), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',2), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',3), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',4), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',5), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',6), ',', -1)) term FROM Resources
) terms
WHERE LENGTH(term) > 0
GROUP BY term
ORDER BY COUNT(*) DESC

如果您的最大任期数超过五个,您可以在联合中加入更多条款。

你应该正常化吗?是的,您应该正常化。您可以使用这种查询来创建表的规范化版本吗?是的。

于 2017-11-06T21:43:01.970 回答