Я рекомендую использовать:
SELECT a.*
FROM TM_ACCOUNTS a
WHERE a.first_name LIKE '%o%'
UNION
SELECT b.*
FROM TM_ACCOUNTS b
WHERE b.last_name LIKE '%o%'
OR
s печально известны низкой производительностью и рисками обслуживания.
Имейте в виду, что я использую UNION
, который удалит дубликаты из окончательного набора результатов. Хотя UNION ALL
будет работать лучше, он не удаляет дубликаты, что делает его не идеальным для использования в этом случае.
В случае, если вы не знали, размещение подстановочного знака слева от ваших критериев LIKE
не будет использовать индекс. Так что, если у вас был индекс на TM_ACCOUNTS.last_name
или TM_ACCOUNTS.first_name
(или оба, если используется индекс покрытия).
Это:
WHERE CONCAT(`last_name`, `first_name`) LIKE '%o%'
... нехорошая привычка - лучше подходить к выполнению этой функции в подселекте или в виде строки. Например:
SELECT x.*
FROM (SELECT t.*,
CONCAT(t.last_name, t.first_name) AS full_name
FROM TM_ACCOUNTS t) x
WHERE x.full_name LIKE '%o%'