【问题标题】:Mysql query, multiple where conditions, which field matches?mysql查询,多个where条件,匹配哪个字段?
【发布时间】:2018-11-20 04:43:03
【问题描述】:

给定一个如下形式的mysql查询:

SELECT *
FROM table
WHERE field1 LIKE '%foo%'
    OR field2 LIKE '%bar%'
    OR field3 LIKE '%foobar%'

标记“匹配字段”的最佳方式是什么?

例如:

+----+--------+--------+----------+
| ID | field1 | field2 |  field3  |
+----+--------+--------+----------+
| 01 |   foo  |   xxx  |    xxx   |
+----+--------+--------+----------+
| 02 |   xxx  |12bar21 |xxfoobarxx|
+----+--------+--------+----------+
| 03 |   f2o  |   bar  |    yxz   |
+----+--------+--------+----------+

这里每条记录都会匹配 - 现在我想知道每条记录的哪个字段匹配。 (所以 ID 01 是 field1,ID 02 是 field2,field3,ID 03 是 field2)

谢谢

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以使用条件向您的选择添加标志,例如:

    SELECT *,
        IF(field1 LIKE '%foo%', 1, 0) AS field1_matches,
        IF(field2 LIKE '%bar%', 1, 0) AS field2_matches,
        IF(field3 LIKE '%foobar%', 1, 0) AS field3_matches
    FROM TABLE
    WHERE field1 LIKE '%foo%'
        OR field2 LIKE '%bar%'
        OR field3 LIKE '%foobar%'
    

    如果您需要将单个字段中的结果作为逗号分隔列表,您可以使用CONCAT_WS 连接结果,并在没有匹配项时在条件内返回NULL

    SELECT *,
        CONCAT_WS(',',
            IF(field1 LIKE '%foo%', 'field1', NULL),
            IF(field2 LIKE '%bar%', 'field2', NULL),
            IF(field3 LIKE '%foobar%', 'field3', NULL)
        ) AS matches
    FROM TABLE
    WHERE field1 LIKE '%foo%'
        OR field2 LIKE '%bar%'
        OR field3 LIKE '%foobar%'
    

    【讨论】:

    • 谢谢,这很好用。当然,所有其他方法也可以,但你的方法是最简单的
    【解决方案2】:

    CASE 表达式怎么样:

    SELECT
        CASE WHEN field1 REGEXP '[[:<:]]foo[[:>:]]|[[:<:]]bar[[:>:]]|[[:<:]]foobar[[:>:]]'
             THEN 'field1' ELSE '' END AS field1match,
        CASE WHEN field2 REGEXP '[[:<:]]foo[[:>:]]|[[:<:]]bar[[:>:]]|[[:<:]]foobar[[:>:]]'
             THEN 'field2' ELSE '' END AS field2match,
        CASE WHEN field3 REGEXP '[[:<:]]foo[[:>:]]|[[:<:]]bar[[:>:]]|[[:<:]]foobar[[:>:]]'
             THEN 'field3' ELSE '' END AS field3match
    FROM yourTable
    

    Demo

    如果你只想匹配子字符串,那么使用这个:

    SELECT
        CASE WHEN field1 REGEXP 'foo|bar|foobar'
             THEN 'field1' ELSE '' END AS field1match,
        CASE WHEN field2 REGEXP 'foo|bar|foobar'
             THEN 'field2' ELSE '' END AS field2match,
        CASE WHEN field3 REGEXP 'foo|bar|foobar'
             THEN 'field3' ELSE '' END AS field3match
    FROM yourTable
    

    【讨论】:

      【解决方案3】:

      使用CONCATCASE

      您正在寻找以下结果,但我知道您希望用逗号或任何其他符号分隔字段,为此我现在无法访问 mysql,所以我认为您可以自己管理

      SELECT *,
          CONCAT(CASE WHEN field1 LIKE '%foo%' THEN 'field1' ELSE NULL END,
                  CASE WHEN field2 LIKE '%bar%' THEN 'field2' ELSE NULL END,
                  CASE WHEN field3 LIKE '%foobar%' THEN 'field3' ELSE NULL END) AS macthed_column
      FROM youtable
      WHERE field1 LIKE '%foo%'
          OR field2 LIKE '%bar%'
          OR field3 LIKE '%foobar%'
      

      输出

      ID  field1  field2  field3      macthed_column
      1   foo     xxx     xxx         field1
      2   xxx     12bar21 xxfoobarxx  field2field3
      3   f2o     bar     yxz         field2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        相关资源
        最近更新 更多