Добрый вечер, прошу помочь решить одну задачку. Делаю каталог товаров, не получается выборка по условию
Таблица товаров - catalog
- id
- scu
- category_id
- name
Таблица характеристик - property
- id
- name
Таблица значения характеристик товаров - property_value
- id
- property_id - id характеристики
- catalog_id - id товара
- value - значение
Нужно получить товары характеристики которых соответствуют условию
например
SELECT * FROM catalog AS c LEFT JOIN property_value AS pv ON (c.id= pv.catalog_id) WHERE property_id=1 AND VALUE = 2
отфильтровать по 1 характеристике получается, а как отфильтровать по нескольким?
Выборка из БД
Ответ в лоб - используй оператор IN
Только у тебя есть ещё условие AND которое вызывает жуткие сомнения в понимании того, что написано. Условия попытайся сформулировать словами.
Код: Выделить всё
SELECT * FROM catalog AS c LEFT JOIN property_value AS pv ON (c.id= pv.catalog_id) WHERE property_id IN (1,2,3,4,5) AND VALUE = 2
Даже самый дурацкий замысел можно воплотить мастерски
Мне нужно отфильтровать товары по разным свойствам
например
свойство property_id=3 равно value=15 и
свойство property_id=14 равно value=2
за 1 запрос
например
свойство property_id=3 равно value=15 и
свойство property_id=14 равно value=2
за 1 запрос
Я вот про что. У тебя по условиям получается, что в таблице property_value у одного и того же товара может быть одна и та же характеристика, но с разными значениями. Т.е. нарушена нормализация. За один плоский запрос тебе данные не извлечь, потому что если поставить IN и там, то у тебя будут выбраны пары property_id=3 равно value=2 и property_id=14 равно value=15.
Если у тебя счётное количество свойств, то тебе подходит UNION (склейка результатов двух последовательных запросов в один общий)
Если у тебя счётное количество свойств, то тебе подходит UNION (склейка результатов двух последовательных запросов в один общий)
Код: Выделить всё
SELECT * FROM catalog AS c LEFT JOIN property_value AS pv ON (c.id= pv.catalog_id) WHERE property_id = 3 AND VALUE = 15
UNION
SELECT * FROM catalog AS c LEFT JOIN property_value AS pv ON (c.id= pv.catalog_id) WHERE property_id = 14 AND VALUE = 2
Даже самый дурацкий замысел можно воплотить мастерски
Нашёл решение
Код: Выделить всё
SELECT * FROM catalog AS c
JOIN property_value AS cv ON(c.id = cv.catalog_id)
AND cv.property_id = 5 AND cv.VALUE=1
JOIN property_value AS cv1 ON(c.id = cv1.catalog_id)
AND cv1.property_id = 4 AND cv1.VALUE=6
Подскажите пожалуйста, как мне написать в Access выражение или созлать запрос: чтобы при выборе в форме, значения элемента Поле со списком (строка - КодТарифа) и значения Поля со списком столбца (Разряд) из таблицы (Тарифы), в поле (Сумма) появлялось значение равное значению на пересечении строки и столбца.