Выборка из БД

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
snaimw
Сообщения: 3
Зарегистрирован: 21 ноя 2012, 20:48

21 ноя 2012, 20:55

Добрый вечер, прошу помочь решить одну задачку. Делаю каталог товаров, не получается выборка по условию
Таблица товаров - 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 характеристике получается, а как отфильтровать по нескольким?
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

22 ноя 2012, 08:48

Ответ в лоб - используй оператор 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 которое вызывает жуткие сомнения в понимании того, что написано. Условия попытайся сформулировать словами.
Даже самый дурацкий замысел можно воплотить мастерски
snaimw
Сообщения: 3
Зарегистрирован: 21 ноя 2012, 20:48

22 ноя 2012, 12:03

Мне нужно отфильтровать товары по разным свойствам
например
свойство property_id=3 равно value=15 и
свойство property_id=14 равно value=2
за 1 запрос
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

23 ноя 2012, 10:12

Я вот про что. У тебя по условиям получается, что в таблице 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
Даже самый дурацкий замысел можно воплотить мастерски
snaimw
Сообщения: 3
Зарегистрирован: 21 ноя 2012, 20:48

23 ноя 2012, 12:30

Нашёл решение

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

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
PuhKMV
Сообщения: 3
Зарегистрирован: 26 мар 2013, 11:16

26 мар 2013, 12:36

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