我的桌子上有逗号分隔字段,它存储标签:
avengers, heroes, marvel, 2012, hulk, captain america
我想获得最常用的标签。
如何在一个SELECT查询中执行此操作?
答案 0 :(得分:1)
你不能 - 一方面,MySQL不提供拆分字符串的功能。您需要规范化数据以在纯SQL中实现此目的。
答案 1 :(得分: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
如果你的最大学期数超过五个,你可以在工会中加入更多的术语。
你应该正常化吗?是的,你应该正常化。您可以使用此类查询来创建表的规范化版本。是。