Только match against
может использовать индекс в вашем поиске.
Однако, если ваша таблица, если не слишком большая, вы можете использовать:
SELECT id, tags
FROM Store
WHERE tags LIKE "garden" OR tags LIKE "garden,%" OR tags LIKE "%, garden,%"
Есть и другие опции (find_in_set), но яна самом деле не хочу вдаваться в подробности, потому что они работают даже хуже, чем приведенный выше SQL.
Реальная проблема, никогда не используйте CSV в базе данных!
Используйте CSV вбаза данных - действительно очень плохая идея, потому что
• Это расточительно, ваши данные не нормализованы
• Вы не можете присоединиться к полю CSV
• Вы не можете использовать индексы для поля CSV
• Полный-текстовые индексы плохо работают с разделителями (как вы видели)
Ответ на создание 2 дополнительных таблиц.
Table tag (innoDB)
----------
id integer primary key auto_increment
tag varchar(50) //one tag per row!
Table tag_link (innoDB)
--------------
store_id integer foreign key references store(id)
tag_id integer foreign key references tag(id)
primary key = (store_id + tag_id) //composite PK
Теперь вы можете легко выполнять любые запросы к тегам.
SELECT s.id, GROUP_CONCAT(t2.tag) FROM store s
INNER JOIN tag_link tl1 ON (s.id = tl1.store_id)
INNER JOIN tag t1 ON (t1.id = tl1.tag_id)
INNER JOIN tag_link tl2 ON (s.id = tl2.store_id)
INNER JOIN tag t2 ON (t2.id = tl2.tag_id)
WHERE t1.tag = 'garden'
GROUP BY s.id
При этом будет выбран один тег с именем garden
(с использованием t1 и tl1) найти все магазины, связанные с этим тегом, а затем связать все теги с этими магазинами (используя t2 и tl2) .
Очень быстро и очень гибко.