假設只有空格分開的話,你可以使用類似以下內容: -
SELECT SomeId, GROUP_CONCAT(SomeWord ORDER BY aNum SEPARATOR " ")
FROM (SELECT SomeId, SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(" ", SomeText, " "), " ", aNum), " ", -1) AS SomeWord, aNum, item_title_default
FROM SomeTable
CROSS JOIN (SELECT 1 + a.I + b.i * 10 + c.i * 100 AS aNum FROM integers a, integers b, integers c) SubInt
WHERE aNum <= (LENGTH(SomeText) - LENGTH(REPLACE(SomeText, " ", "")) + 2)
AND LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(" ", SomeText, " "), " ", aNum), " ", -1)) > 3
ORDER BY SomeId, aNum) Sub1
GROUP BY SomeId
這依賴於整數的表稱爲單列我,用行與值0到9它可以處理多達1000個字,但很容易擴展。
編輯 - 好的,這裏是一個MySQL存儲過程,用來分割字符串並刪除任何長度不超過3個字的字。再次只在空間分裂。
DELIMITER //
CREATE FUNCTION `func_Remove_ShortStrings`(InStr LONGTEXT) RETURNS LONGTEXT
DETERMINISTIC
BEGIN
DECLARE RetStr LONGTEXT DEFAULT "";
DECLARE TempStr LONGTEXT DEFAULT "";
DECLARE aWord LONGTEXT DEFAULT "";
DECLARE WordLength INT DEFAULT 0;
SET TempStr = TRIM(InStr);
WHILE (LENGTH(TempStr) > 0) DO
SET aWord = SUBSTRING_INDEX(TempStr, " ", 1);
SET WordLength = LENGTH(aWord);
IF (WordLength > 3) THEN
SET RetStr = CONCAT(RetStr, " ", aWord);
END IF;
SET TempStr = TRIM(SUBSTRING(TempStr, WordLength + 1));
END WHILE;
return TRIM(RetStr);
END
也許你根本不需要這些功能?也許全文索引就是你要找的東西?像「in」這樣的短語會被自動忽略。 – fancyPants 2013-04-22 09:18:58
字符串有多複雜?如果這些單詞總是用空格分隔,那麼它不會太糟糕,但它需要應對逗號,句號等,然後它變得更加複雜。 – Kickstart 2013-04-22 09:27:53
我有一個全文索引。最小單詞是3.「in」在停止列表中,但是如果我搜索「+ hotels + in + amsterdam」,它不顯示任何結果,即使我有確切的關鍵字。 – 2013-04-22 09:50:47