LINUX.ORG.RU

many-to-many и поиск


0

0

Возник такой вот вопрос.

Есть таблица некоторых объектов, таблица свойств. Ну и таблица пар (object_id, prop_id)

Можно ли написать такой запрос который бы выдавал объекты со свойствами, заданными в списке. get_objects_by_props(props=['a','b','c'])

пока на ум приходит добавить каждому объекту строку строку типа '(prop_a_id)(prop_b_id)...' и искать уже регулярным выражением по этим строкам.

С sql не очень знаком, может есть способ покрасивше?

★★

Ответ на: комментарий от geshido

Не совсем уверен, но кажется это выдаст. те объекты которые обладают свойствами a,b,c. Но не обязательно всеми?

no1sm ★★
() автор топика

ну как бы у разных СУБД разные дилекты SQL, да и язык на котором ты пишешь неизвестен, а телепаты в отпуске.

SELECT t1.val, t2.val FROM table1 t1 LEFT JOIN table3 t3 ON t1.id=t3.id_t1 LEFT JOIN table2 t2 ON t2.id=t3.id_t2 WHERE 1

для mysql, если не где не ошибся ... table1 - объект, table2-свойство, table3 - промежуточная таблица

phasma ★☆
()

select obj.value
from object obj
where exists(select prop.id from pair, prop where pair.object_id = obj.id and pair.prop_id = prop.id and prop.value = 'a')
  and exists(select prop.id from pair, prop where pair.object_id = obj.id and pair.prop_id = prop.id and prop.value = 'b')
  and exists(select prop.id from pair, prop where pair.object_id = obj.id and pair.prop_id = prop.id and prop.value = 'c')

как-то так. Правда тормозить будет, мама не горюй..

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ну это уже похоже на правду. Но может все-таки стоит кэшировать в самой таблице объектов id свойств?

no1sm ★★
() автор топика

может конечно уже позно но вот...
примерно так...

SELECT objects.* 
FROM (
      SELECT o.object_id
      FROM pairs p 
          JOIN objects o ON o.object_id = o.object_id 
          JOIN props pp pp.prop_id=p.prop_id 
      WHERE props.name in ('a', 'b', 'c')
      GROUP BY o.object_id
      HAVING COUNT(DISTINCT *) = 3
     ) AS tmp
     JOIN objects o ON o.object_id = tmp.object_id 

в MSSQL сработает, в мускуле, думаю, тож можно подобное сделать. 
ЗЫ: запрос не проверен, он отражает лишь идею

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.