MYSQL 关键字列的 REGEXP 查询
MYSQL REGEXP query for keywords column
我需要一个正则表达式来获取只有关键字 52 的用户和有关键字 52,53 但没有 54 的用户。下面是 table 结构
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[[:>:]]'
尝试使用 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
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[[:>:]]
,正如 OP 最初的想法一样,以防止匹配,比如 154。
我需要一个正则表达式来获取只有关键字 52 的用户和有关键字 52,53 但没有 54 的用户。下面是 table 结构
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[[:>:]]'
尝试使用 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
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[[:>:]]
,正如 OP 最初的想法一样,以防止匹配,比如 154。