Поиск по key value таблице MySQL

Достаточно часто сущность, с которой необходимо работать и хранить о ней данные, имеет динамическое количество параметров и хранить их как колонку в той же таблице сущности и каждый раз добавлять новую не совсем верно так как у одного допустим продукта свойств девять, а у другой не более двух. Для этого используют дополнительную дочернюю таблицу с полями ключа,значения и внешнего ключа.
Тем самым добавлять и удалять параметры к каждой конкретной записи очень удобно.

Проблема же возникает с поиском, причём со сложными поиском когда мы хотим искать допустим продукт по двум-трём свойствам одновременно. Обычный SELECT * FROM table a ,param b WHERE b.product_id = a.id AND b.key='param1' AND b.value='1' AND b.key='param2' AND b.value='2' не даст результата так как будет выбрана одна запись из param. Для таких выражений нужно использовать сложную конструкцию JOIN вида:

SELECT * FROM product a
INNER JOIN param b ON a.id = b.product_id

INNER JOIN param c ON b.product_id = c.product_id
WHERE
(b.key = 'param1' AND b.value = '1')
AND
(c.key = 'param2' AND c.value = '2')

Тем самым мы связываем эти записи в одну.
Если вы хотите добавить третий параметр на поиск вам надо написать еще раз:
INNER JOIN param d ON b.product_id = d.product_id
И в WHERE:
(d.key = 'param3' AND d.value = '3')

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *