Mysql запрос, несколько, где условия, какое поле соответствует? - PullRequest
0 голосов
/ 20 ноября 2018

с учетом запроса 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   |
+----+--------+--------+----------+

Здесь будет сопоставляться каждая запись - теперь я хочу знать, какое поле для каждой записи соответствует.(Таким образом, для идентификатора 01 это поле1, для идентификатора 02 это поле2, поле3, а для идентификатора 03 это поле2)

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вы можете добавить флаги, используя условные выражения к вашему выбору, например:

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%'
0 голосов
/ 20 ноября 2018

Использование CONCAT и CASE

Вы точно ищете приведенный ниже результат, но я знаю, что вы хотите разделить поля запятой или любым другим знаком, для этого у меня сейчас нет доступа к 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%'

OUTPUT

ID  field1  field2  field3      macthed_column
1   foo     xxx     xxx         field1
2   xxx     12bar21 xxfoobarxx  field2field3
3   f2o     bar     yxz         field2
0 голосов
/ 20 ноября 2018

Как насчет 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

Демо

Если вы просто хотите сопоставить подстроки, используйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...