我有一个存储过程,如http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/中所述,使用MySQL的Substring()函数来获取字符串中的每个单词。我想要的是以下查询返回出现在Sentences表的每一行中的每个单词。目前,我需要过滤位置1,2,3等。但我不知道一个句子可能有多少单词,所以这是非常低效的。如何在一个查询中获取所有句子中的所有单词的任何想法?
SELECT DISTINCT SPLIT_STR(`SentenceText`, " ", 1) AS Word FROM `Sentences`;
举个例子: 如果句子包含2行:
this is a sentence
sentence galore
我想要一个返回的查询:
this
is
a
sentence
galore
答案 0 :(得分:0)
您需要使用GROUP_CONCAT函数将所有句子放在一行中:
SELECT GROUP_CONCAT(sentence_column SEPARATOR ' ')
FROM Sentences
GROUP BY sentence_column;
然后你需要对句子进行标记化并将标记插入临时表中,然后从那里进行选择。 Here是一个很好的例子(我认为这正是你需要的)。祝你好运!
更新(因为downvotes):我的回答可能是问题不是单个查询,而是三个步骤:
SELECT * FROM WORDS
我认为这些步骤可以达到预期的效果(但不能在单个查询中实现)
如果将这三个步骤放在新的存储过程中,则可以对其执行单个查询。
如果你打算投票,请至少花时间解释你为什么要贬低(因为我花时间阅读问题和回答)。
答案 1 :(得分:0)
这是完成这项工作的mysql过程(已通过mysql 5.5测试):
DROP PROCEDURE if exists split_sentence;
delimiter $$
CREATE PROCEDURE split_sentence(sentence varchar(255), delimiter VARCHAR(50), out result_wordcount INTEGER)
BEGIN
DECLARE last_position INTEGER;
DECLARE position INTEGER;
DROP TABLE IF EXISTS tmp_split_sentence;
CREATE TEMPORARY TABLE tmp_split_sentence (word varchar(255));
set last_position = 1;
set position = instr(sentence, delimiter);
-- select position;
WHILE position > 0 DO
-- select concat('found: ', substring(sentence, last_position, position-last_position));
INSERT INTO tmp_split_sentence (word) VALUES(substring(sentence, last_position, position-last_position));
set last_position = position+length(delimiter);
set position = locate(delimiter, sentence, last_position);
-- select concat('position: ', position);
END WHILE;
-- wrap up to the end of the sentence
if last_position < length(sentence) then
INSERT INTO tmp_split_sentence (word) VALUES(substring(sentence, last_position, length(sentence)-last_position+1));
end if;
SELECT count(*) into result_wordcount from tmp_split_sentence;
END$$
delimiter ;
DROP TABLE IF EXISTS tmp_sentence;
CREATE TEMPORARY TABLE tmp_sentence (word varchar(255));
call split_sentence('this is a sentence', ' ', @result_wordcount);
INSERT INTO tmp_sentence select * from tmp_split_sentence;
call split_sentence('sentence galore', ' ', @result_wordcount);
INSERT INTO tmp_sentence select * from tmp_split_sentence;
select * from tmp_sentence;
结果:
this
is
a
sentence
sentence
galore
请注意,该句子有时会出现,应该在问题中加以修正:)。