Django много к одному обратному запросу в одном поле - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть отношение один ко многим между двумя таблицами ...

Item - id, title

ItemAttribute - id, item_id , attribute_code (string, indexed)

, где attribute_code может иметь значения для цветов, размеров, качеств, размеров и т. д. c, - как коды 'Blue', 'Black', 'White', 'S ',' L ',' XL ',' 250g ',' 400g 'и др. c

Вопрос : Как запросить все Предметы , которые либо ('Blue' ИЛИ ​​'White') И 'XL'

Я предпочитаю использовать Django ORM, но если кто-то может даже помочь с raw SQL, то все будет в порядке. Спасибо.

1 Ответ

1 голос
/ 10 апреля 2020

Этот подзапрос:

select item_id
from item_attribute
group by item_id
having sum(attribute_code in ('Blue', 'White')) > 0 and sum(attribute_code = 'XL') > 0

возвращает все item_id, которые вы хотите. Таким образом, вы можете присоединить его к таблице item:

select i.*
from item i inner join (
  select item_id
  from item_attribute
  group by item_id
  having sum(attribute_code in ('Blue', 'White')) > 0 and sum(attribute_code = 'XL') > 0
) a on a.item_id = i.id

или использовать оператор IN:

select *
from item 
where id in (
  select item_id
  from item_attribute
  group by item_id
  having sum(attribute_code in ('Blue', 'White')) > 0 and sum(attribute_code = 'XL') > 0
) 

Если у вас действительно большие наборы данных, вы также можете попробовать EXISTS:

select i.*
from item i
where 
  exists (select 1 from item_attribute where item_id = i.id and attribute_code in ('Blue', 'White'))
  and
  exists (select 1 from item_attribute where item_id = i.id and attribute_code = 'XL')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...