【问题标题】:Select All Distinct Words in Column MYSQL选择 MYSQL 列中的所有不同单词
【发布时间】:2017-09-15 21:44:08
【问题描述】:

我有一列只存储由一个空格分隔的文本。列的每个字段中可能有 1 到 5 个单词。我需要一个查询来返回该列中所有不同的单词。

试过了:

SELECT DISTINCT tags FROM documents ORDER BY 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

【问题讨论】:

  • “不起作用” - 你能详细说明一下吗?你现在得到了什么结果,预期的结果是什么?您还需要在此处发布架构/值和与 php 的相关性。编辑:在编辑中删除了 php 标记。 stackoverflow.com/revisions/43499498/2
  • 如果 DISTINCT 不起作用,请尝试添加 GROUP BY
  • 如果每个标签在另一个表中的自己的行上,这将是世界上最简单的事情......
  • 通过在列上选择 DISTINCT MYSQL 将只返回列中每个字段的不同字符串。不是 DISTINCT 单个词。
  • 首先将字符串拆分成行:stackoverflow.com/questions/17942508/… 然后您可以分组并获取计数,因为您已经拥有了标准化数据。

标签: mysql select distinct


【解决方案1】:

对此没有好的解决方案。我认为,您可以使用 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;

如果您运行的是

【讨论】:

    【解决方案2】:

    为了解决这个问题,我最终创建了第二个表,其中所有关键字都插入到各自的行中,以及将它们绑定回主数据表中的原始记录的记录键。然后我只需要 SELECT DISTINCT 来获取所有标签,或者我可以 SELECT DISTINCT 使用指定原始记录的 WHERE 子句来获取与唯一记录关联的标签。容易得多。

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多