MySQL первый приоритет соответствия условия - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть эти данные

+----+--------+---------------------------------+
| id | fromid |            message              |
+----+--------+---------------------------------+
|  1 |  1213  | this is just an example         |
+----+--------+---------------------------------+
|  2 |  1992  | other random message            |
+----+--------+---------------------------------+
|  3 |  1364  | example number three            |
+----+--------+---------------------------------+

Мне нужно искать данные, где fromid='1992' или message LIKE '%example%'

если есть результат, где fromid соответствует значению 1992, вернуть этот результат и игнорировать второе условие

но если нет результата из первого условия (fromid='1992'), вернуть результат из второго условия

можно ли сделать это по одному запросу?

1 Ответ

0 голосов
/ 29 апреля 2018

Один из способов сделать это - использовать маркер, а затем ограничить результаты первым рядом. Пример использования UNION: -

SELECT 1 AS match_type, my_table.* 
from  my_table  
where fromid = 1992 
UNION
SELECT 2 AS match_type, my_table.*
from  my_table  
WHERE message like  '%example%'
ORDER BY match_type
LIMIT 1

Недостатком является то, что он все еще вызывает относительно медленный неиндексированный запрос, используя LIKE с лидирующим подстановочным знаком.

Ниже приводится альтернатива. В большинстве случаев это было бы бессмысленно, но если ожидалось, что проверка идентификатора будет возвращать запись почти всегда, а проверка на LIKE - очень случайное условие (когда-либо возвращалась только одна запись), тогда это может быть целесообразно, так как это позволит избежать поиска условия «делать медленный LIKE» без необходимости.

SELECT COALESCE(id, SELECT MAX(id) from my_table WHERE message like '%example%') AS id,
    COALESCE(fromid, SELECT MAX(formed) from my_table WHERE message like '%example%') AS formed,
    COALESCE(message, SELECT MAX(message) from my_table WHERE message like '%example%') AS message 
FROM
(
    SELECT id, fromid, message 
    FROM (SELECT 1 AS a_cnt) sub0
    LEFT OUTER JOIN
    (
        SELECT id, fromid, message 
        from  my_table  
        where fromid = 1992 
    ) sub1
) sub2
...