SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.04.2012 15:18:57

severinivan
Участник
Зарегистрирован: 22.04.2012
Сообщений: 1

Выборка элементов на основе требований

Здравствуйте, большая просьба помочь наиболее оптимально по отношению к производительности составить запрос (или несколько, если одним это выполнить невозможно) по следующему описанию проблемы:

Есть набор некоторых элементов (таблица 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)

Неактивен

 

#2 22.04.2012 19:44:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка элементов на основе требований

А если на входе есть ID свойств:  1 и 2, то запись попадет в конечную выборку?

Если нет, то задача решается без REQUIREMENTS

select fk_id_item from ITEM_PROPS where fk_id_property in (список id свойств) group by 1 having count(*)>= количество_id_свойств;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson