【问题标题】:MySQL Like multiple valuesMySQL 喜欢多个值
【发布时间】:2011-05-09 12:03:22
【问题描述】:

我有这个 MySQL 查询。

我有包含这些内容的数据库字段

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games   

为什么这样的查询不起作用? 我需要运动或酒吧或两者兼有的领域?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')

【问题讨论】:

    标签: mysql sql sql-like


    【解决方案1】:

    (a,b,c) 列表仅适用于 in。对于like,你必须使用or

    WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
    

    【讨论】:

    • 这在多个(比如 5 个或更多动态可搜索查询)中没有好处,因此,最好使用正则表达式。
    • @ShayanAhmad 你所说的有益是什么意思?在创建查询或查询执行时间方面? LIKE 不是比 REGEXP 更 otpmized 吗?
    【解决方案2】:

    您的查询应该是SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

    我的理解是,您将兴趣存储在表格的一个字段中,这是一种误解。你应该明确地有一个“兴趣”表。

    【讨论】:

    • 我认为应该是SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'),但这种技术在大多数情况下可能会胜过正则表达式。
    【解决方案3】:

    更快的方法:

    WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
    

    这是:

    WHERE interests REGEXP 'sports|pub'
    

    在此处找到此解决方案:http://forums.mysql.com/read.php?10,392332,392950#msg-392950

    更多关于 REGEXP 的信息在这里:http://www.tutorialspoint.com/mysql/mysql-regexps.htm

    【讨论】:

    • 如果您将未知数量的关键字作为字符串 (a|b|c...) 传递,那么如果您想做 LIKE,正则表达式是唯一的方法,是吗?
    • 你知道这是否可以通过子查询来完成吗?假设我有一列需要搜索的单词,如何将“sports|pub”替换为子查询?
    • 嘿,请告诉我 LIKE 的 REGEXP 而不是 %LIKE%,我正在尝试获取确切的字符串...
    • 此解决方案将第一个从水中吹出
    • 从列中获取正则表达式值:(select group_concat(myColumn separator '|') from..)
    【解决方案4】:

    如果在AND 参数后使用此函数,请不要忘记使用括号

    像这样:

    WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')
    

    【讨论】:

      【解决方案5】:

      为什么不试试 REGEXP。试试这样:

      SELECT * FROM table WHERE interests REGEXP 'sports|pub'
      

      【讨论】:

      • 是的!我想要相反的方式。所以是SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (>‿◠)✌
      • 这个答案与你之前 5 年提交的jazkat 答案有何不同?
      • @Vaidas - 谢谢 - 问自己同样的问题......:D
      【解决方案6】:

      就像@Alexis Dufrenoy 提议的那样,查询可能是:

      SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0
      

      更多信息在manual

      【讨论】:

        【解决方案7】:

        您也可以使用REGEXP 的同义词RLIKE

        例如:

        SELECT *
        FROM TABLE_NAME
        WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
        

        【讨论】:

        • 请注意,RLIKE 和 REGEXP 是同义词
        【解决方案8】:

        更多作品示例:

        SELECT COUNT(email) as count FROM table1 t1 
        JOIN (
              SELECT company_domains as emailext FROM table2 WHERE company = 'DELL'
             ) t2 
        ON t1.email LIKE CONCAT('%', emailext) WHERE t1.event='PC Global Conference";
        

        如果电子邮件扩展名等于多个公司域,则任务是使用过滤器计算事件的参与者。

        【讨论】:

          【解决方案9】:

          或者如果您只需要匹配单词的开头:

          WHERE interests LIKE 'sports%' OR interests LIKE 'pub%'
          

          您可以使用正则表达式插入符匹配:

          WHERE interests REGEXP '^sports|^pub'
          

          https://www.regular-expressions.info/anchors.html

          【讨论】:

          • 这不起作用,我有类似 "1, 2,3, 30, 20" 的值。因此,当我运行查询 WHERE Interest REGEXP '3^|2^' 时,它不会返回任何数据。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-03
          • 2014-03-30
          • 2012-03-17
          • 2010-11-10
          相关资源
          最近更新 更多