I would like to create query to search given information in table users. Table consists: of id, username, firstname, lastname, phone and email.
Sample search text: mat h 50 @l d
The only record that should be returned: 1 | admin | mat | hladeo | 123450789 | admin@localhost
My query:
SELECT * FROM `users` WHERE (
(`firstname` LIKE '%mat%') || (`firstname` LIKE '%h%') ||
(`firstname` LIKE '%50%') || (`firstname` LIKE '%@l%') ||
(`firstname` LIKE '%d%')
) && (
(`lastname` LIKE '%mat%') || (`lastname` LIKE '%h%') ||
(`lastname` LIKE '%50%') || (`lastname` LIKE '%@l%') ||
(`lastname` LIKE '%d%')
) && (
(`phone` LIKE '%mat%') || (`phone` LIKE '%h%' ) ||
(`phone` LIKE '%50%') || (`phone` LIKE '%@l%') ||
(`phone` LIKE '%d%')
) && (
(`email` LIKE '%mat%') || (`email` LIKE '%h%') ||
(`email` LIKE '%50%' ) || (`email` LIKE '%@l%') ||
(`email` LIKE '%d%')
) && (
(`username` LIKE '%mat%') || (`username` LIKE '%h%') ||
(`username` LIKE '%50%') || (`username` LIKE '%@l%') ||
(`username` LIKE '%d%')
)
But this query is returning people who have got username containing d and their phone number contains 50.
EDIT:
this query returns 3 rows:
1 | admin | mat | hladeo | 123450789 | admin@localhost
8 | dillese | Adriana | Zolch | 44450232 | [email protected]
12 | dcolhut | Denise | Colhut | 502222222 | [email protected]
and should return only first row (because matches all the requirements).
==========
And the main question - how to optimize this query? Is it possible to make it simplier?
Regards
LIKEpattern:fieldname RLIKE 'mat|h|50|@l|d'It will still be inefficient, since this regexp has to scan all records, it can't use an index.dand phone containing50? What is the matching logic supposed to be?dand phone containing50