我有一个列,其中只存储了由一个空格分隔的文本。列的每个字段中可能有一个到5个字。我需要一个查询来返回该列中的所有不同单词。
尝试:
SELECT DISTINCT tags FROM documents ORDER BY tags
但不起作用。
详细说明。
我有一个名为tags的列。在其中我可能有以下条目:
Row 1 Red Green Blue Yellow
Row 2 Red Blue Orange
Row 3 Green Blue Brown
我想要选择整个列中的所有DISTINCT
个字词 - 所有字段。它会回来:
Red Green Blue Yellow Orange Brown
如果我计算每一个它会返回:
2 Red
2 Green
3 Blue
1 Yellow
1 Brown
1 Orange
答案 0 :(得分:0)
为了解决这个问题,我最终创建了一个第二个表,其中所有关键字都插入到自己的行中,每个关键字都带有一个记录键,将它们连接回主数据表中的原始记录。然后我只需要SELECT DISTINCT来获取所有标签,或者我可以使用WHERE子句SELECT DISTINCT指定原始记录以获取与唯一记录关联的标记。更容易。
答案 1 :(得分:0)
对此没有好的解决方案。你可以用 5.6 的 JSON 函数来实现这一点,我认为,但它有点棘手,直到 8.0,当 mySQL 添加了 JSON_TABLE 函数时,它可以将 json 数据转换为类似对象的表并对其执行选择,但它将如何执行取决于您的实际数据。这是一个工作示例:
CREATE TABLE t(raw varchar(100));
INSERT INTO t (raw) VALUES ('this is a test');
您需要从文本中去除符号(逗号、句点,也可能是其他符号),然后将任何白色文本替换为“,”,然后将整个内容包裹在 [" 和 "] 中以进行 json 格式设置。我不会给出一个完整的例子,因为你比我更了解你的数据是什么样的,但类似这样(以最简单的形式):
SELECT CONCAT('["', REPLACE(raw, ' ', '","'), '"]') FROM t;
使用 JSON_TABLE,您可以执行以下操作:
SELECT CONCAT('["', REPLACE(raw, ' ', '","'), '"]') INTO @delimited FROM t;
SELECT *
FROM JSON_TABLE(
@delimited,
"$[*]"
COLUMNS(Value varchar(50) PATH "$")
) d;
看这个小提琴:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7a86fcc77408ff5dfec7a805c6e4117a
此时您有一个拆分词表,您可以将 SELECT *
替换为您想要的任何计数查询,可能是 SELECT Value, count(*) as vol
。您还需要使用 group_concat 来处理多行。像这样:
insert into t (raw) values ('this is also a test'), ('and you can test it');
select concat(
'["',
replace(group_concat(raw SEPARATOR '","'), ' ', '","'),
'"]'
) into @delimited from t;
SELECT Value, count(*) as vol
FROM JSON_TABLE(
@delimited,
"$[*]"
COLUMNS(Value varchar(50) PATH "$")
) d
GROUP BY Value ORDER BY count(*) DESC;
如果您运行的是 <8.0,您仍然可以完成此操作,但这需要一些技巧,例如生成任意数字列表并从中动态构建路径。