KupueIIIKo
@KupueIIIKo

Поиск по ключу в строках, реальн?

Может я вообще не верно построил БД.
Но я пошел по такому пути) Есть таблица ключ - значение
Пример:
1. Фамилия - Иванов
2. Имя - Иван
3. Фамилия - Петров
4. Имя - Петр

А теперь у меня поиск человека по Фамилии и Имени, естественно используя LIKE.
ТО есть для фамилии свое поле, для имени свое поле.
Если использовать LIKE по одному полю. Все работает. Естественно добавляя второй ключ результаты он не найдет. Потому, что запрос получается такой
SELECT `pid` FROM `promisers_data` as `pd` WHERE 1 and (`key`='family' and `value` LIKE '%Иванов%') and (`key`='name' and `value` LIKE '%Иван%')

Какие есть выходы из этой ситуации?
  • Вопрос задан
  • 327 просмотров
Решения вопроса 1
akzhan
@akzhan
SELECT
    pd.pid
  FROM
    promisers_data pd 
    INNER JOIN promisers_data pd2 ON pd.pid = pd2.pid
  WHERE 1
    AND (pd.key='family' AND pd.value LIKE '%Иванов%')
    AND (pd2.key='name' AND pd2.value LIKE '%Иван%')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Это как оно у вас так построилось??? В смысле что за кей, валуе? Назачем? Таблица просто должна содержать 3 (по вашему примеру) поля, примерно так:
id | family | name
1 Иванов Иван
2 Петров Коля
3 Иванов Василий
...
тогда номальный запрос будет возвращать нужный результат
SELECT `id` 
FROM `promisers_data` as `pd` 
WHERE  (`family` LIKE 'Иванов') 
and (`name` LIKE 'Иван')

Если вы ищете фамилию, то не нужно ее искать в середине поля фамилии, то есть % перед текстом запроса не нужен, а по уму и в конце лишний, если вы не ищете все похожие имена с другим окончанием. И работать будет в разы быстрее, а если еще и индексы на поля создать - вообще летать будет. Особенно если заменить like на равенство(=).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы