2013-06-07 2 views
0

Мой пример немного глупо, но самое лучшее, которое было в моем уме;)граф строк на realted таблиц (два или более)

Zoo 
=== 
Id 
Name 

Animal 
======= 
Id 
Species 
ZooId 

Zookeeper 
========= 
Id 
FullName 
ZooId 

С помощью следующих строк в них:

Zoo 
=== 
1, New York 
2, Berlin 

Animal 
====== 
1, Tiger, 1 
2, Monkey, 1 
3, Bear, 1 
4, Tiger, 2 
5, Zebra, 2 

Zookeeper 
========= 
1, John Doe, 1 
2, Peter Smith, 2 
3, Ronald Jackson, 2 
4, Michael Miller, 2 

Мой ожидаемый результат должен быть:

New York, 3, 1 
Berlin, 2, 3 

Я пробовал следующий запрос, но это вздор.

SELECT Zoo.Name, COUNT(Animal.Id) AS Animals, COUNT(Zookeeper.Id) AS Zookeepers 
FROM Zoo 
LEFT JOIN Animal ON Animal.ZooId = Zoo.Id 
LEFT JOIN Zookeper ON Zookeeper.ZooId = Zoo.Id 
GROUP BY Zoo.Name 

У меня одинаковое количество для обеих колонок, и для небольших наборов данных требуется минут.

+0

Используйте индексирование на своих столбцах, например 'Animal.ZooId',' Zookeeper.ZooId' – Salil

+0

COUNT (Zookeeper.Id), возможно? –

+0

Все соответствующие поля имеют индекс. Я редактировал свой пост, я имел в виду COUNT (Zookeeper.Id) – dannyyy

ответ

1

Попробуйте

SELECT z.Name, 
     COALESCE(a.Animals, 0) Animals, 
     COALESCE(k.Zookeepers, 0) Zookeepers 
    FROM Zoo z LEFT JOIN 
( 
    SELECT zooid, COUNT(*) Animals 
    FROM animal 
    GROUP BY zooid 
) a ON z.id = a.zooid LEFT JOIN 
( 
    SELECT zooid, COUNT(*) Zookeepers 
    FROM zookeeper 
    GROUP BY zooid 
) k ON z.id = k.zooid 

Выход:

|  NAME | ANIMALS | ZOOKEEPERS | 
------------------------------------ 
| New York |  3 |   1 | 
| Berlin |  2 |   3 | 

Вот SQLFiddle

1

Попробуйте это,

select t1.nm,t2.Animal_count,t3.Zookeeper_count 
FROM Table1 t1 
INNER JOIN 
(select t22,count(Animal) AS Animal_count from Table2 group by(t22)) t2 
ON t1.id=t2.t22 
INNER JOIN 
(select t32,count(name) As Zookeeper_count from Table3 group by(t32)) t3 
ON t1.id=t3.t32 

SQLFiddle Demo

Смежные вопросы