【问题标题】:MYSQL REGEXP query for keywords columnMYSQL REGEXP 查询关键字列
【发布时间】:2016-05-25 04:45:25
【问题描述】:

我需要一个正则表达式来让用户只有关键字 52 和有关键字 52,53 但没有 54 的用户。下面是表结构

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[[:>:]]' 

【问题讨论】:

    标签: mysql regex keyword-search


    【解决方案1】:

    尝试使用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
    

    【讨论】:

      【解决方案2】:
      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 [[:&lt;:]]54[[:&gt;:]],就像OP的原始想法一样,以防止匹配,比如154。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-01
        • 2012-04-28
        相关资源
        最近更新 更多