2016-05-25 1 views
1

мне нужно регулярное выражение, чтобы получить пользователи имеют только ключевое слово 52 и пользователей, которые имеют ключевое слово 52,53, но не ниже 54. Структура таблицыMYSQL REGEXP запрос для столбца ключевых слов

CREATE TABLE `User` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(100) NOT NULL, 
    `last_name` varchar(100) NOT NULL, 
    `keywords` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Sample record1: 100, Sam, Thompson, "50,51,52,53,54" 
Sample record2: 100, Wan, Thompson, "50,52,53" 
Sample record3: 100, Kan, Thompson, "53,52,50,54" 

50 = sports 
51 = cricket 
52 = soccer 
53 = baseball 
54 = tennis 

до сих пор это запрос, который я придумал. она дает запись со всего 3.

SELECT * FROM `User` WHERE keywords REGEXP '[[:<:]]52,53,54[[:>:]]' 

ответ

3

Попробуйте использовать FIND_IN_SET() вместо сложного регулярного выражения:

SELECT u.* 
FROM User 
WHERE text = '52' OR 
    (FIND_IN_SET('52', text) > 0 AND FIND_IN_SET('53', text) > 0 AND 
    FIND_IN_SET('54', text) = 0) 

Объяснение:

WHERE text = '52' -- users who have keyword 52 and only this keyword 
WHERE FIND_IN_SET('52', text) > 0 AND FIND_IN_SET('53', text) > 0 AND 
    FIND_IN_SET('54', text) = 0 
        -- users who have keywords 52 and 53 but not 54 
1
SELECT * FROM `User` WHERE keywords RLIKE "^52$"; --only 52 
SELECT * FROM `User` WHERE keywords RLIKE "(.*(52|53)){2}" AND keywords not RLIKE "54"; -- users who have keywords 52 and 53 but not 54 

редактировать: для записи : второй запрос действительно должен быть not rlike [[:<:]]54[[:>:]] , как в оригинальной идее ОП, для предотвращения совпадения, скажем, 154.

http://sqlfiddle.com/#!9/cdc530/13