【问题标题】:Possible with one MySQL query? "column contains any of the array's values"一个 MySQL 查询可能吗? “列包含任何数组的值”
【发布时间】:2013-05-09 03:04:44
【问题描述】:

基本上我想检查一个包含逗号分隔值的mysql文本列是否包含数组中包含的任何值。我知道这可以通过循环和多个查询来完成,但我希望只有一个查询。这可能吗?谢谢。

【问题讨论】:

    标签: mysql arrays contains


    【解决方案1】:

    我会使用这样的解决方案:

    SELECT
      *
    FROM
      yourtable
    WHERE
      str RLIKE
      CONCAT('[[:<:]]', REPLACE('values,in,the,array', ',', '[[:>:]]|[[:<:]]'), '[[:>:]]')
    

    这将产生以下字符串:

    'values,in,the,array'
    

    像这样:

    [[:<:]]values[[:>:]]|[[:<:]]in[[:>:]]|[[:<:]]the[[:>:]]|[[:<:]]array[[:>:]]
    

    [[:&lt;:]][[:&gt;:]] 是单词边界,因此它只会匹配整个单词,并且 |是 OR,因此它将匹配任何单词。请看小提琴here

    【讨论】:

    • 这是一个聪明的方法,它可以让我摆脱困境。不得不再说一遍:永远不要用字符串代替外键!!!总有一天你会感到疼痛!!!
    【解决方案2】:

    你是说

    ... WHERE my_column LIKE '%first_array_value%' OR my_column LIKE '%second_array_value%'
    

    它会起作用,但由于性能而非常糟糕。还有一种方法

    ... WHERE MATCH (my_column) AGAINST ('first_array_value second_array_value')
    

    但最好的方法是尽可能改变数据结构。

    【讨论】:

      【解决方案3】:

      SELECT COUNT(*) FROM my_table WHERE (my_column LIKE '%,0,%' OR my_column LIKE '%,1,%');

      SELECT COUNT(*) FROM my_table WHERE (my_column REGEXP LIKE '.*,[0-1],.*');

      【讨论】:

        猜你喜欢
        • 2015-12-21
        • 2018-04-27
        • 2011-05-12
        • 1970-01-01
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        相关资源
        最近更新 更多