【发布时间】:2010-09-24 06:48:07
【问题描述】:
如何查询以获取字段中匹配单词的计数,特别是在 MySQL 中。 只是我需要获取“搜索词”在字段值中出现的次数。
例如,值是“一二一一二”,所以当我搜索单词“一”时,它应该给我 3
有可能吗?因为目前我只是从数据库中提取值并使用服务器端语言进行计数。
谢谢
【问题讨论】:
-
你能更好地描述你想要什么吗?最好有例子...
如何查询以获取字段中匹配单词的计数,特别是在 MySQL 中。 只是我需要获取“搜索词”在字段值中出现的次数。
例如,值是“一二一一二”,所以当我搜索单词“一”时,它应该给我 3
有可能吗?因为目前我只是从数据库中提取值并使用服务器端语言进行计数。
谢谢
【问题讨论】:
您是否正在寻找一个查询,给定一个单词列表,返回数据库字段中匹配单词的数量?
例如:
数据库表有
身份证条款 1 猫、狗、鸟、马然后检查“猫,马”这个词返回 2?
如果是这样,我建议您在 SQL 之外进行检查,使用任何语言进行其余处理。SQL 不是为这种级别的处理而设计的。 p>
您可以可能使用存储过程来循环检查您需要检查的单词,但我怀疑它是否有效或高效。
当然,如果我误解了您的要求,我可能全都错了 =)
【讨论】:
我建议您在 SQL 之外执行此操作,无论引擎如何,正则表达式都比 SQL 语言更适合。您可能可以使用视图或其他东西来做到这一点,但正如我所说,有更合适的方法可以做到这一点,例如您的语言或正则表达式中的字符串操作类/对象/函数。
【讨论】:
您可以创建一个直接在 SQL 中使用的函数,以便一步完成。
这里是a function which I found on the MySQL website:
delimiter ||
DROP FUNCTION IF EXISTS substrCount||
CREATE FUNCTION substrCount(s VARCHAR(255), ss VARCHAR(255)) RETURNS TINYINT(3) UNSIGNED LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA
BEGIN
DECLARE count TINYINT(3) UNSIGNED;
DECLARE offset TINYINT(3) UNSIGNED;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = NULL;
SET count = 0;
SET offset = 1;
REPEAT
IF NOT ISNULL(s) AND offset > 0 THEN
SET offset = LOCATE(ss, s, offset);
IF offset > 0 THEN
SET count = count + 1;
SET offset = offset + 1;
END IF;
END IF;
UNTIL ISNULL(s) OR offset = 0 END REPEAT;
RETURN count;
END;
||
delimiter ;
你应该这样使用它:
SELECT substrCount('one two one onetwo', 'one') `count`; // Returns 3
【讨论】:
如果您一次只需要搜索一个词,那么一个功能类似于
select (len(field)-len(replace,find,''))/len(find)
可以在 sql server 中工作,但我不确定 MySQL。您还需要处理特殊情况 len(find) = 0。
【讨论】: