选择列MYSQL中的所有不同单词

时间:2017-04-19 15:04:10

标签: mysql select distinct

我有一个列,其中只存储了由一个空格分隔的文本。列的每个字段中可能有一个到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

2 个答案:

答案 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,您仍然可以完成此操作,但这需要一些技巧,例如生成任意数字列表并从中动态构建路径。