我使用的是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[[:>:]]')
现在,这个查询是根据用户输入生成的,每个空格都会将事物分解为搜索到的不同部分。我想根据所有部分的匹配数量来订购结果,这样最相关的结果就在最顶层。
答案 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)。没有关于匹配数量的信息,因此也无法进行排序。