Задумывались ли вы о разделении исходного кода и тегов на отдельные таблицы?
Source Table
ID, Title, Source
1 "t1" "sc"
2 "t2" "sc"
3 "t3" "sc"
Tag Table
ID, Tag
1 "Zend"
2 "Smarty"
3 "jquery"
4 "doctrine"
SourceTagLink Table
SourceID, TagID
1 1
1 2
2 1
2 3
3 4
Таким образом, у вас есть уникальный список тегов, из которых вы можете выбирать или добавлять.Вы не будете выполнять разбор строк, поэтому ваш выбор будет намного быстрее.Это похоже на то, как вы присваиваете теги своему сообщению на этом сайте.
РЕДАКТИРОВАТЬ
Это функция, которую я использовал для преобразования многозначной строки в таблицу с одним столбцомон написан на MSSQL, но вы должны быть в состоянии преобразовать его в mySQL
CREATE FUNCTION [dbo].[ParseString](@String NVARCHAR(4000), @Delimiter CHAR(1)=',')
RETURNS @Result TABLE(tokens NVARCHAR(4000))
AS
BEGIN
-- We will be seearching for the index of each occurrence of the given
-- delimiter in the string provided, and will be extracting the characters
-- between them as tokens.
DECLARE @delimiterIndex INT
DECLARE @token NVARCHAR(4000)
-- Try to find the first delimiter, and continue until no more can be found.
SET @delimiterIndex = CHARINDEX(@Delimiter, @String)
WHILE (@delimiterIndex > 0)
BEGIN
-- We have found a delimiter, so extract the text to the left of it
-- as a token, and insert it into the resulting table.
SET @token = LEFT(@String, @delimiterIndex-1)
INSERT INTO @Result(tokens) VALUES (LTRIM(RTRIM(@token)))
-- Chop the extracted token and this delimiter from our search string,
-- and look for the next delimiter.
SET @String = RIGHT(@String, LEN(@String)-@delimiterIndex)
SET @delimiterIndex = CHARINDEX(@Delimiter, @String)
END
-- We have no more delimiters, so place the remainder of the string
-- into the result as our last token.
SET @token = @String
INSERT INTO @Result(tokens) VALUES (LTRIM(RTRIM(@token)))
RETURN
END
В основном вы называете это как
ParseString('this be a test', ' ')
it will return a single column table
this
be
a
test
ParseString('this:be a test', ':')
returns
this
be a test
Вы можете добавить вызов функции в триггер обновленияЗаполните новые таблицы, чтобы помочь вам сделать выбор намного проще.После создания триггера просто выполните простое обновление, подобное следующему
Update yourTable
Set Title = Title
, которое запустит триггер и заполнит новые таблицы, а также упростит вам задачу, не затрагивая существующий код.Конечно, вам нужно заменить все известные разделители на один, чтобы он работал.
Любые новые записи, добавленные или измененные, будут автоматически запускать триггер.