Здравствуйте! У меня есть таблица, в ней хранятся данные по династическим полям. Выглядит она так:
id | product_id | category_id | field_id | value_string | value_int 1 | 15 | 120 | 1 | Бренд-1 | 0 1 | 16 | 120 | 1 | Бренд-2 | 0 1 | 15 | 120 | 2 | null | 5 1 | 16 | 120 | 2 | null | 15 1 | 17 | 120 | 1 | Бренд-1 | 0 1 | 17 | 120 | 2 | null | 55
field_id с id 1 - поле бренда, с id 2 - размер
Мне нужно получить product_id у которых поле бренд (field_id - 1) равен "Бренд-1" и "Бренд-2" и поле размер (field_id - 2) с диапазоном к примеру от 5 до 40
Из данных выше, результатом должен быть product_id с 15 и 16. product_id с 17 не подходит по диапазону, хоть и поле бренд содержит "Бренд-1 "
Подскажите в какую сторону идти. Хотелось бы пример реализации на Yii2, но буду благодарен и за чистый sql пример.
P.S.
Возможно я не так построил таблицу с данными, если да, то подскажите что не так и как лучше.
Спасибо! Всем добра!
Добрый день. На YII2 этот запрос может выглядеть так
Model_name::find()
->select('product_id')->distinct()
->where('in', 'product_id', ['Бренд-1','Бренд-2'])
->orWhere(['between', 'product_id', 'Бренд-1','Бренд-2'])
->all();
Детально ознакомиться можно здесь.
Вариант 1
SELECT product_id
FROM `table`
WHERE (field_id = 1 AND value_string IN ('Бренд-1','Бренд-2'))
OR (field_id = 2 AND value_int BETWEEN 5 AND 40)
GROUP BY product_id
HAVING COUNT(DISTINCT field_id) = 2
Вариант 2
SELECT DISTINCT t1.product_id
FROM `table` t1, `table` t2
WHERE (t1.field_id = 1 AND t1.value_string IN ('Бренд-1','Бренд-2'))
AND (t2.field_id = 2 AND t2.value_int BETWEEN 5 AND 40)
AND t1.product_id = t2.product_id
Ну и вообще - уж если взяли модель EAV, так почитайте про неё побольше...
PS. Как это превратить в Yii2-код - я фиг знает.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не получается разобраться, каким образом при вызове метода передать в него параметр, кроме как указать его явно в первом методеЗадумка задачи,...