![]()  | 
		
Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте, большая просьба помочь наиболее оптимально по отношению к производительности составить запрос (или несколько, если одним это выполнить невозможно) по следующему описанию проблемы:
Есть набор некоторых элементов (таблица 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
Неактивен