Другие способы сделать этот запрос? - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть следующие таблицы:

Animals (animal_id, producer_id, ...)
Producers (prod_id, ...)
BoughtAnimals (animal_id (fk), ...)

, и я хотел бы сделать запрос, который скажет мне для каждого производителя, сколько у него животных и сколько было куплено этих животных.После долгих раздумий я попробовал следующий подход:

select Producers.name, count (distinct A1.animal_id), count(distinct BoughtAnimals.animal_id)
from Producers, Animals A1, Animals A2, BoughtAnimals
where
  Producers.nif = A1.producer_id and
  Producers.nif = A2.producer_id and
  BoughtAnimals.animal_id = A2.animal_id
group by Producers.name;

, но я сделал это только методом проб и ошибок, и мне трудно рассуждать сразу о нескольких таблицах Animal.Есть ли другой способ сделать этот запрос?Или это обычный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011

Попробуйте что-то вроде этого

select p.name,
    sum(case when ba.anyfield is not null then 1 else 0 end) bought_count,
    count(1) total_count
from Producers p join Animals a on (p.nif = a.producer_id)
    left join BoughtAnimals ba using (animal_id)
group by p.name;
1 голос
/ 02 февраля 2011

Используйте простое JOIN, затем вы можете поместить «COUNT» в оператор HAVING.См. Документацию по LEFT / INNER JOIN и HAVING, в зависимости от вашей SGDB.

0 голосов
/ 03 февраля 2011

Я пока игнорирую таблицу производителей;все важные данные, которые вам нужны, находятся в двух других таблицах.Как только эта часть верна, вы можете просто выполнить внутреннее соединение таблицы производителей, чтобы получить другие необходимые вам данные.

select a1.producer_id, 
       count(a1.animal_id) as num_animals, 
       count(b1.animal_id) as num_bought
from animals a1
left join boughtanimals b1 on (b1.animal_id = a1.animal_id)
group by producer_id;

Мне не ясно, лучше ли этот последний столбец назван "num_bought" или"num_sold".Также неясно, что для производителя означает «иметь» животное, учитывая, что некоторые животные либо покупаются, либо продаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...