Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте, большая просьба помочь наиболее оптимально по отношению к производительности составить запрос (или несколько, если одним это выполнить невозможно) по следующему описанию проблемы:
Есть набор некоторых элементов (таблица ITEMS):
ITEMS
-----------------
id | name |
-----------------
1 | name 1
2 | name 2
3 | name 3
4 | name 4
-----------------
И имеется таблица неких свойств (PROPERTIES):
PROPERTIES
-----------------
id | name |
-----------------
1 | prop 1 |
2 | prop 2 |
3 | prop 3 |
4 | prop 4 |
5 | prop 5 |
-----------------
Так же существует таблица с текущими свойствами для каждой записи из ITEMS, то есть теми, которые имеет каждая запись из ITEMS в данный момент (ITEM_PROPS). fk_id_item - это внешний ключ на ITEMS.id и fk_id_property - на PROPERTIES.id
ITEM_PROPS
-----------------------------
fk_id_item | fk_id_property |
-----------------------------
1 | 1
1 | 2
2 | 2
2 | 3
2 | 4
2 | 5
3 | 1
3 | 4
3 | 5
Так же есть таблица некоторых требований (REQUIREMENTS), где указано, какими свойствами должна располагать каждая из записей в ITEMS вообще, а не только в данный момент, что бы попасть в конечную выборке. Здесь fk_id_item - это внешний ключ на ITEMS.id и fk_id_property - на PROPERTIES.id
REQUIREMENTS
------------------------------
fk_id_item | fk_id_property |
------------------------------
1 | 1
1 | 2
1 | 3
2 | 2
2 | 3
2 | 5
3 | 4
3 | 5
3 | 2
------------------------------
То есть, здесь представлено, что запись из ITEMS с ID = 1 должна иметь в ITEM_PROPS три записи, а именно:
1 | 1
1 | 2
1 | 3
что бы удовлетворить условию требований и попасть в результирующу выборку. Если же запись не обладает хотя бы одним свойством, то в выборку она не должна попасть в выборку.
НУЖНО:
имея "на входе" список некоторых значений ID свойств (то есть PROPERTIES.id) получить те записи, которые удовлетворяют требованиям (то есть, имеют на данный момент все необходимые записи в таблице ITEM_PROPS, наличие которых указано в таблице REQUIREMENTS)
ПРИМЕР:
- получили следующие ID-ы свойств: 1, 2, 3
- определили на основе таблицы требований (REQUIREMENTS), какие записи (ITEMS) должны обладать ВСЕМИ этими свойствами, что бы попасть в выборку,- из таких имеющихся, только item с id = 1
- и определили, какие из необходимых свойств есть на данный момент у этого item с id = 1 (по таблице ITEM_PROPS): это только "1 и 2" поэтому, единственная подходящая нам запись условиям выборки не удовлетворяет, поэтому, в результате, ничего выбрано не будет.
* если бы в таблице ITEM_PROPS было бы следующее состояние для записи из таблицы ITEMS с id = 1, как:
fk_id_item | fk_id_property |
-----------------------------
1 | 1
1 | 2
1 | 3
то эта бы запись (запись из таблицы ITEMS с id = 1) попала бы в конечную выборку, так как она имеет все необходимые свойства, в таблице ITEM_PROPS, которые указаны в таблице REQUIREMENTS для этой записи (записи из ITEMS с id = 1)
p.s. "имея на входе список некоторых значений ID свойств" - не важно откуда получаемые данные, допустим мы их так же просто выбираем из какой-то таблице, просто имеем в качестве констант и т.д.
Отредактированно severinivan (22.04.2012 15:20:23)
Неактивен
А если на входе есть ID свойств: 1 и 2, то запись попадет в конечную выборку?
Если нет, то задача решается без REQUIREMENTS
Неактивен