【问题标题】:MySQL count matching wordsMySQL计算匹配词
【发布时间】:2010-09-24 06:48:07
【问题描述】:

如何查询以获取字段中匹配单词的计数,特别是在 MySQL 中。 只是我需要获取“搜索词”在字段值中出现的次数。

例如,值是“一二一一二”,所以当我搜索单词“一”时,它应该给我 3

有可能吗?因为目前我只是从数据库中提取值并使用服务器端语言进行计数。

谢谢

【问题讨论】:

  • 你能更好地描述你想要什么吗?最好有例子...

标签: sql mysql database


【解决方案1】:

您是否正在寻找一个查询,给定一个单词列表,返回数据库字段中匹配单词的数量?

例如:

数据库表有

身份证条款 1 猫、狗、鸟、马

然后检查“猫,马”这个词返回 2?

如果是这样,我建议您 SQL 之外进行检查,使用任何语言进行其余处理。SQL 不是为这种级别的处理而设计的。 p>

您可以可能使用存储过程来循环检查您需要检查的单词,但我怀疑它是否有效或高效。

当然,如果我误解了您的要求,我可能全都错了 =)

【讨论】:

    【解决方案2】:

    我建议您在 SQL 之外执行此操作,无论引擎如何,正则表达式都比 SQL 语言更适合。您可能可以使用视图或其他东西来做到这一点,但正如我所说,有更合适的方法可以做到这一点,例如您的语言或正则表达式中的字符串操作类/对象/函数。

    【讨论】:

    • 是的,这就是我所做的,但是它使循环加倍,并且由于表包含数百条记录,因此花费了很多时间
    【解决方案3】:

    您可以创建一个直接在 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
    

    【讨论】:

      【解决方案4】:

      如果您一次只需要搜索一个词,那么一个功能类似于

      select (len(field)-len(replace,find,''))/len(find)
      

      可以在 sql server 中工作,但我不确定 MySQL。您还需要处理特殊情况 len(find) = 0

      【讨论】:

        猜你喜欢
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-21
        相关资源
        最近更新 更多