Определение типа поиска
У меня есть проект в нём я пишу поиск для нахождения контактов, и вообщем есть одна проблема, поиск ведет по коду, телефон, email. Я могу написать sql функцию для поиска через один запрос, но есть ли возможность как определить по какому именно параметру было найдено совпадение, по телефону или email, или коду ?? Просто сейчас у меня сделано 3 запроса, т.к. учитывая по какому параметру было найдено совпадение то мне и надо выводить, т.е. если это телефон то выводу телефоны, email значит email и т.д.
Код поиска выглядит примерно так:
public function searchContactByPhoneCodeEmailOrderId($search) {
$search_condition = \cArray::stripQuotes([
'code' => \cString::prepareSearchString($search),
'email' => \cString::prepareSearchString($search),
'phone' => $search
]);
$type = 'code';
$response_contact = cFactory::getDB()->getRows("
SELECT TOP 15
ID_Code,
code,
ID_Contact
FROM
tblCode
WHERE
ID_Contact IS NOT NULL
AND code LIKE '" . $search_condition['code'] . "%'
", __FILE__, __LINE__);
if (empty($response_contact)) {
$response_contact = cAuthorizationModel::model()->getContactByOldCode($search_condition['code']);
}
if (empty($response_contact) && cChecker::phone($search_condition['phone'])) {
$type = 'phone';
$response_contact = cFactory::getDB()->getRows("
SELECT TOP 15
ID_Contact,
phone
FROM
tblContact
WHERE
phone LIKE '" . $search_condition['phone'] . "%'
", __FILE__, __LINE__);
}
...
}
Ну суть думаю ясна, всю её писать не буду слишком большая получается.
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
В синтаксисе SQL это может быть, например, так:
SELECT *, 'phone' AS source
FROM table
WHERE LOCATE(@search_string, phone)
UNION ALL
SELECT *, 'email'
FROM table
WHERE LOCATE(@search_string, email)
UNION ALL
SELECT *, 'code'
FROM table
WHERE LOCATE(@search_string, code)