2011-09-01 30 views
2

我正在使用SQL查询,如WHERE name REGEXP '[[:<:]]something[[:>:]]'可能通过找到的匹配数量来命令与REGEX匹配的SQL查询?

现在这一切都很好,但我的结果并不是按照我所寻找的匹配数来排序。关于如何去做这个或者甚至可能的任何想法?

感谢

完整的查询是

SELECT `Item`.`id`, `Item`.`name`, `Item`.`short_bio` 
    FROM `items` AS `Item` 
    WHERE ((`Item`.`name` REGEXP '[[:<:]]hello[[:>:]]') OR 
      (`Item`.`name` REGEXP '[[:<:]]world[[:>:]]') 

现在是基于用户输入而产生这个查询,每一个空间,打破了东西到被搜索的不同部分。我想根据所有部分匹配的数量来排列结果,这样最相关的结果在顶部。

+0

如果您需要精确的帮助,您应该提供完整的查询。 – krtek

+0

匹配什么? –

回答

1

我发现了一个UDF前一段时间做这个。我很抱歉,我不能引用来源。

DELIMITER // 

CREATE DEFINER=`root`@`localhost` FUNCTION `substrCount`(s VARCHAR(255), ss VARCHAR(255)) RETURNS tinyint(3) unsigned 
    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 ; 

还有一个漂亮的解决方案here

+0

这个漂亮的解决方案,你发布了一个完美的链接,谢谢一堆。 – Bobbake4

+0

另外,如果您想将它们排列为使用该函数,则替换调用区分大小写。使用此用户自定义函数对大小写匹配进行排名,无需http://forge.mysql.com/tools/tool.php?id=132。 – Bobbake4

+0

@ bobbake4感谢您的反馈。我注意到另一种解决方案比我发布的UDF快大约10倍。 – gilden

0

MySQL中的正则表达式匹配运算符根据是否分别找到匹配返回1或0(如果模式或字符串为空,则返回null)。没有关于匹配数量的信息可用,因此排序也是不可能的。

2

如何像这样(不知道MySQL的,所以它可能需要的调整):

SELECT `Item`.`id`, `Item`.`name`, `Item`.`short_bio` 
FROM `items` AS `Item` 
WHERE ((`Item`.`name` REGEXP '[[:<:]]hello[[:>:]]') OR 
     (`Item`.`name` REGEXP '[[:<:]]world[[:>:]]') 
ORDER BY (`Item`.`name` REGEXP '[[:<:]]hello[[:>:]]') + 
     (`Item`.`name` REGEXP '[[:<:]]world[[:>:]]') DESC