Страница 1 из 1

Выборка из БД

Добавлено: 21 ноя 2012, 20:55
snaimw
Добрый вечер, прошу помочь решить одну задачку. Делаю каталог товаров, не получается выборка по условию
Таблица товаров - 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 характеристике получается, а как отфильтровать по нескольким?

Re: Выборка из БД

Добавлено: 22 ноя 2012, 08:48
AiK
Ответ в лоб - используй оператор IN

Код: Выделить всё

 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
Только у тебя есть ещё условие AND которое вызывает жуткие сомнения в понимании того, что написано. Условия попытайся сформулировать словами.

Re: Выборка из БД

Добавлено: 22 ноя 2012, 12:03
snaimw
Мне нужно отфильтровать товары по разным свойствам
например
свойство property_id=3 равно value=15 и
свойство property_id=14 равно value=2
за 1 запрос

Re: Выборка из БД

Добавлено: 23 ноя 2012, 10:12
AiK
Я вот про что. У тебя по условиям получается, что в таблице property_value у одного и того же товара может быть одна и та же характеристика, но с разными значениями. Т.е. нарушена нормализация. За один плоский запрос тебе данные не извлечь, потому что если поставить IN и там, то у тебя будут выбраны пары property_id=3 равно value=2 и property_id=14 равно value=15.
Если у тебя счётное количество свойств, то тебе подходит 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

Re: Выборка из БД

Добавлено: 23 ноя 2012, 12:30
snaimw
Нашёл решение

Код: Выделить всё

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

Re: Выборка из БД

Добавлено: 26 мар 2013, 12:36
PuhKMV
Подскажите пожалуйста, как мне написать в Access выражение или созлать запрос: чтобы при выборе в форме, значения элемента Поле со списком (строка - КодТарифа) и значения Поля со списком столбца (Разряд) из таблицы (Тарифы), в поле (Сумма) появлялось значение равное значению на пересечении строки и столбца.