可以通过找到的匹配数来订购与REGEX匹配的SQL查询吗?

时间:2011-09-01 21:04:42

标签: php mysql regex

我使用的是WHERE name REGEXP '[[:<:]]something[[:>:]]'等SQL查询。

现在这一切都很好但我的结果并没有根据找到的匹配数来排序,这正是我要找的。关于如何做到这一点或有甚么可能的任何想法?

由于

完整查询

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

现在,这个查询是根据用户输入生成的,每个空格都会将事物分解为搜索到的不同部分。我想根据所有部分的匹配数量来订购结果,这样最相关的结果就在最顶层。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

MySQL中的正则表达式匹配运算符返回1或0,具体取决于是否找到匹配(如果模式或字符串为空,则返回null)。没有关于匹配数量的信息,因此也无法进行排序。