2013-11-22 73 views
2

匹配,我有以下MySQL查詢其作品數字符CONCAT MySQL的REGEXP

SELECT *, 
CONCAT(office, ' ', contactperson) AS bigDataField 
FROM webcms_mod_references 
HAVING bigDataField REGEXP "one|two" 

現在有沒有ORDER BY,如果: - bigDataField包含「一」這一欄中顯示 - bigDataField包含「一個兩個「這個字段顯示爲

現在它取決於哪一個顯示第一,但我希望有更多的匹配顯示第一!

我試着用

SUM(
    CASE WHEN bigDataField REGEXP "one|two" 
     THEN 1 
     ELSE 0 END 
    ) AS matches 

但是,這並不工作。誰能幫我。我認爲最好的方式就像標題所說的那樣來計算REGEXP中的匹配字符。如果有其他方法請解釋。

REGEXP是一個用戶輸入,所以我試圖在一個小型數據庫上實現一個小型搜索。

回答

2

這是理論上的,而sqlfiddle是跌,但你可能要在REGEXP分成兩個,所以你可以計數比賽。 REGEXP將返回一個0或1,它匹配或不匹配。不支持查找它在字符串中匹配的次數。

SELECT *, 
CONCAT(office, ' ', contactperson) AS bigDataField 
FROM webcms_mod_references 
HAVING bigDataField REGEXP "one|two" 
ORDER BY (bigDataField REGEXP "one" + bigDataField REGEXP "two") DESC 
+0

SQLFile down,stackoverflow在mysql上的回答率會下降到:) – nrathaus

+0

這是一個很好的解決方案。我正要寫後,我寫我的:)只有一件事是,你應該反向排序字段(使用DESC') –

+0

@MostyMostacho同意。謝謝。 – Moob

1

無法計算正則表達式匹配的數量。你可以做的是分別匹配它們並按照每個匹配進行排序。 EG:

SELECT *, 
CONCAT(office, ' ', contactperson) AS bigDataField 
FROM webcms_mod_references 
HAVING bigDataField REGEXP "one|two" 
ORDER BY 
    CASE WHEN bigDataField REGEXP "one" AND bigDataField REGEXP "two" THEN 0 
     ELSE 1 -- The else should catch the "two" alone or the "one" alone because of the filtering 
    END 

當然,你也可以在這裏使用一個LIKE太多,但也許你的正則表達式是比:)更復雜

+0

我會試試這個,謝謝。是的,他們有點複雜。也許我可以在幾個小時內分享一個現場示例 – caramba

0

當我要算一些子我更換和「 - 」的長度,例如:

SELECT (
     LENGTH('longstringlongtextlongfile') - 
     LENGTH(REPLACE('longstringlongtextlongfile', 'long', '')) 
     )/LENGTH('long') AS `occurrences` 

我認爲這是對計算多少次「長的問題,一個優雅的解決方案'出現裏面提供'字符串'

+0

聰明。再加上一個[REGEXP_REPLACE UDF](https://launchpad.net/mysql-udf-regexp),你確實可以得到一些匹配。 – Moob