2016-03-16 4 views
1

У меня есть зоопарк животных.Выберите общее количество элементов на

зоопарка Таблица

id | name | 

Таблица животных

id | zoo_id | name | type 
1  1  Horse  0 
2  1  Elephant 0 
3  1  Parrot  1 
4  2  Whale  2  
5  2  Fox  0 
6  1  Snake  3 

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

MySQL

SELECT zoo.id as zooid,zoo.name, 
(SELECT COUNT(*) FROM animal WHERE animal.zoo_id = zoo.id) as total_animals 
FROM zoo; 

Но как я смог получить все тип животных существующих в этом зоопарке

Ожидаемый результат

zooid | name | total | available_types 
1  USAZOO 4  0 1 3  
2  UKZOO 2  0 2  

И так как я собирается выбрать много зоопарка, поэтому производительность имеет значение

+0

ВСТУПИТЕЛЬ. С GROUP BY. – jarlh

+0

Уточните пожалуйста @jarlh –

+3

Шаг 1) ПРИСОЕДИНЯЙТЕСЬ с зоопарком. Шаг 2) Сделайте GROUP BY. – jarlh

ответ

1

Вы можете использовать GROUP_CONCAT:

SELECT zoo.id as zooid,zoo.name, 
     (SELECT COUNT(*) FROM animal WHERE animal.zoo_id = zoo.id) as total_animals, 
     group_concat(type separator ' ') 
FROM zoo 
GROUP BY zoo.id,zoo.name 

Я думаю, вам это нужно, чтобы имена зоопарка, а также, как вы получите результаты имя? Во всяком случае -

SELECT zoo.id as zooid, 
     group_concat(zoo.name separator ' ') as zoo_name, 
     (SELECT COUNT(*) FROM animal WHERE animal.zoo_id = zoo.id) as total_animals, 
     group_concat(type separator ' ') 
FROM zoo 
GROUP BY zoo.id 

И вы должны делать это с объединением:

SELECT zoo.id as zooid, 
     group_concat(zoo.name separator ' ') as zoo_name, 
     COUNT(*) as total_animals, 
     group_concat(type separator ' ') 
FROM zoo 
INNER JOIN animals 
ON animal.zoo_id = zoo.id 
GROUP BY zoo.id 
+0

Не можете ли вы заменить подзапрос на счетчик (*)? – jarlh

+0

@jarlh вы имеете в виду добавить соединение, а затем подсчитать все, да, я также добавил это решение. – sagi

+0

Итак, какой из них лучше? последний ? –

0

Уточнение ответ Саги:

SELECT Zoo.id as zooid, zoo.name AS name, 
     COUNT(*) AS total, 
     GROUP_CONCAT(DISTINCT type separator ' ') AS available_types 
FROM Zoo 
INNER JOIN Animal 
ON Animal.zoo_id = zoo.id 
GROUP BY zoo.id 

Это дает вам только различные виды животных. Вы можете поиграть с ним здесь: SQLFiddle

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