温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sql - How to get all distinct words of a specified minimum length from multiple columns in a MySQL table?
mysql regex sql text

sql - 如何从MySQL表的多个列中获取指定最小长度的所有不同单词?

发布于 2020-03-27 11:39:08

在MySQL 5.6数据库中,我有一个tablename包含三TEXT列的表:(包括其他col_a, col_b, col_c

我想从这三列中提取至少5个字符的所有唯一单词(单词用空格隔开)。“单词”是指任何非空格字符字符串,例如“ foo-123”和“ 099423”都是单词。这些列都是utf8格式的InnoDB列。

是否有单个查询可以做到这一点?

编辑:根据要求,下面是一个示例:(在实际数据中,col_a,col_b和col_c是TEXT字段,可能包含大量单词。)

select id, col_a, col_b, col_c from tablename;

id  | col_a              | col_b          | col_c
----|--------------------|----------------|----------------------
1   | apple orange plum  | red green blue | bill dave sue
2   | orange plum banana | yellow red     | frank james
3   | kiwi fruit apple   | green pink     | bill sarah-jane frank

expected_result: ["apple", "orange", "banana", "fruit", 
                  "green", "yellow", "frank", "james", "sarah-jane"]

我不在乎结果的顺序。谢谢!

编辑:在上面的示例中,所有内容都是小写,因为这就是我将所有内容存储在与该问题相关的现实表中的方式。但是,为了争辩,如果它确实包含一些大写字母,我希望查询忽略大写字母(这是我的数据库配置的设置)。

EDIT2:如果有帮助,则所有文本列上均具有FULLTEXT索引。

EDIT3:这是创建示例数据的SQL:

DROP TABLE IF EXISTS `tablename`;
CREATE TABLE `tablename` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col_a` text,
  `col_b` text,
  `col_c` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
LOCK TABLES `tablename` WRITE;
INSERT INTO `tablename` VALUES (1,'apple orange plum','red green blue','bill dave sue'),(2,'orange plum banana','yellow red','frank james'),(3,'kiwi fruit apple','green pink','bill sarah-jane frank');
UNLOCK TABLES;

查看更多

查看更多

提问者
Max Williams
被浏览
225
Rick James 2019-07-08 21:30

Shell脚本可能是有效的...

  1. SELECT CONCAT_WS(' ', col_a, col_b, col_c) INTO OUTFILE 'x' ... 将列放入文件中
  2. tr ' ' "\n" <x -每行分成一个单词
  3. awk 'length($1) >= 5' -每个字最少5个字符
  4. sort -u -去重复

没有停用词,但是sed或awk可以解决。

 mysql -e "SELECT ... INTO OUTFILE 'x' ..." ...
 tr ' ' "\n" <x  |  awk 'length($1) >= 5'  |  sort -u