Поиск через запятую - PullRequest
       8

Поиск через запятую

1 голос
/ 22 марта 2011

Таблица образцов

CREATE TABLE 
   `foo` (
        `id` INT NOT NULL AUTO_INCREMENT ,     
        `keyword_ids` VARCHAR(128) ,     
        PRIMARY KEY (`id`)  
   );

Пример данных

INSERT INTO 
    `foo`
SET
    `keyword_ids` = '14,10,5,19,12'

Пример запроса

SELECT 
    * 
FROM 
    `foo` 
WHERE 
    (`keyword_ids` LIKE '5,%%' 
    OR 
    `keyword_ids` LIKE '%%,5' 
    OR 
    `keyword_ids` = '5' 
    OR 
    `keyword_ids` LIKE '%%,5,%%')

Согласно моему последнему вопросу, это работает просто отлично, но есть ли способ, которым я могу улучшить его?

Ответы [ 2 ]

3 голосов
/ 22 марта 2011
SELECT  *
FROM    foo
WHERE   FIND_IN_SET(5, keyword_ids)

Обратите внимание, однако, что это выражение по-прежнему не может быть sargable, это означает, что индекс keyword_ids не может улучшить этот запрос.

Вам следует нормализовать вашу модель, если вы хотите, чтобы это было быстрым для поиска.

Другой вариант - сохранить ключевые слова, разделенные запятыми (а не ids), в таблице и создать для них индекс FULLTEXT:

CREATE FULLTEXT INDEX fx_foo_keyword ON (keywords)

SELECT  *
FROM    foo
WHERE   MATCH(keywords) AGAINST ('+keyword5' IN BOOLEAN MODE)

Это, однако,работать только на MyISAM столе.

1 голос
/ 22 марта 2011

Посмотрите на функцию FIND_IN_SET .

...