在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;
Shell脚本可能是有效的...
SELECT CONCAT_WS(' ', col_a, col_b, col_c) INTO OUTFILE 'x' ...
将列放入文件中tr ' ' "\n" <x
-每行分成一个单词awk 'length($1) >= 5'
-每个字最少5个字符sort -u
-去重复没有停用词,但是sed或awk可以解决。
mysql -e "SELECT ... INTO OUTFILE 'x' ..." ...
tr ' ' "\n" <x | awk 'length($1) >= 5' | sort -u
谢谢-这是一种很有前途的方法,但
uniq
似乎并不能解决问题。这就是我正在做的事情:dbname='my_database'; fname='/tmp/tablename_strings.txt'; sudo chown max:max $fname; rm $fname; mysql -u root $dbname -e "SELECT CONCAT_WS(' ', col_a, col_b, col_c) FROM tablename INTO OUTFILE '$fname'"; tr ' ' '\n' <"$fname" | awk 'length($1) >= 5' | uniq
我得到了(用换行符分隔):apple orange green orange banana yellow frank james fruit apple green sarah-jane frank
@MaxWilliams-糟糕,我忘记了
sort
。(并且可能会有一个de-dup选项sort
,可以避免使用uniq
。)您可以
sort -u
结合使用sort和uniq步骤。我已将此提示(也包括赏金),因为它是许多建议中最快的。谢谢!
有时,它有助于“开箱即用”。(在这种情况下,该框是MySQL。)