2011-09-01 32 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