【问题标题】:MYSQL match csv keywords column [duplicate]MYSQL匹配csv关键字列[重复]
【发布时间】:2016-02-24 06:54:46
【问题描述】:

我在用户表中有以下方式的记录

id    name     address    keywords
1     thompsan paris      10,20,30
2     samson   paris      10,20,30
3     Nilawa   paris      10,20,30
4     Nalama   paris      100,30,50
5     Nalama   paris      100,300,20

我需要获取关键字为 10 或 20 的用户。我写了这个查询:

SELECT * from User where keywords REGEXP '[[:<:]]10|20[[:>:]]' 

它没有给我预期的输出。它应该过滤 id 10 或 20 并给我记录 1、2、3、5 的输出。记录 4 在这里不匹配。

为什么它不起作用?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: mysql sql regex csv


    【解决方案1】:

    试试这个,

    SELECT  *
    FROM    user
    WHERE   FIND_IN_SET('10', keywords) > 0 OR
            FIND_IN_SET('20', keywords) > 0 
    

    FIND_IN_SET 是 MySQL 的内置函数

    【讨论】:

    • 有没有办法在不添加一个字符串的情况下将一组字符串添加到第一个参数?例如,FIND_IN_SET('10,20', keywords)
    【解决方案2】:

    重新设计您的数据库,使其实际上处于 1NF 中,您将不必处理这些令人头疼的问题,更不用说它必然会导致您失败的可怕性能和错误。

    虽然我知道你不会那样做,所以根本不需要使用REGEXP,假设你在keywords 中的字符串实际上是一致的(如果不是,那么无论如何你都搞砸了)。只需使用LIKE

    SELECT  -- We'll list out the columns, since we NEVER use SELECT *
        id,
        name,
        address,
        keywords
    FROM
        User
    WHERE
        ',' + keywords + ',' LIKE '%,10,%' OR
        ',' + keywords + ',' LIKE '%,20,%'
    

    【讨论】:

    • 我试过了,没有输出。 SELECT * FROM User WHERE ',' + 关键字 + ',' LIKE '%,80,%'
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多