2016-01-14 2 views
0

У меня есть 2 стола: Person and House. У каждого человека есть имя, адрес электронной почты и номер телефона, в то время как в доме есть несколько комнат и город. Я должен показать каждому человеку имя и ряд домов, где количество домов - это количество домов, которые у него есть.Подсчет домов для каждого человека в MySQL

Это, кажется, отношение один-имеет-многие. Так вот мой запрос для Person таблице:

CREATE TABLE Person (person_id INT NOT NULL PRIMARY KEY, 
     name VARCHAR(15) NOT NULL, 
     email VARCHAR(320) NOT NULL, 
     phone_number VARCHAR(15) NOT NULL); 

и вот запрос Палаты таблицы:

CREATE TABLE House (
    house_id INT NOT NULL PRIMARY KEY, 
    person_id INT NOT NULL, 
    number_of_rooms INT NOT NULL, 
    city_location VARCHAR(15) NOT NULL, 
    FOREIGN KEY(person_id) REFERENCES Person(person_id)); 

Как показать, сколько домов у каждого человека, я написал этот запрос:

SELECT name AS "Person name", count(house_id) AS "Number of houses" FROM Person JOIN House WHERE Person.person_id = House.person_id; 

Но этот запрос только показывает только первое имя, которое я уже вставлен (вставленный более) и сумму house_id для этого имени (для house_id # 1 & # 2 & # 3 результат должен быть как 3, но он показывает 6) и все.

Когда я впервые об этом подумал, это очень легко построить, я не знаю, почему я трачу столько времени на это. Любая помощь?

ответ

1

Вам нужен group by. И вы должны использовать предложение ON, когда используете JOIN. Я бы также рекомендовал табличные псевдонимы. Они делают запрос проще писать и читать:

SELECT p.name AS "Person name", count(h.house_id) AS "Number of houses" 
FROM Person p JOIN 
    House h 
    ON p.person_id = h.person_id 
GROU PBY p.name; 
+0

Точно! он работал просто отлично! и когда это сработало, я действительно подумал: «Почему я пропустил это?» : -/Thanks Gordon –

1
SELECT p.name AS "Person name", count(h.house_id) AS "Number of houses" 
FROM Person p 
LEFT JOIN House h ON h.person_id = p.person_id 
GROUP BY p.name 

Это то, что вам нужно.

Что изменилось, были следующие:

  • Добавлены псевдонимы для таблиц (пригождается)
  • Пользовалась LEFT OUTER JOIN (LEFT JOIN для краткости) вместо INNER JOIN (JOIN для краткости), чтобы получить даже люди, которые не имеют никакого соответствия дома (количество домов будет равна нулю для них)
  • Добавлен пункт ON для JOIN (требуется для синтаксиса)
  • Добавлен пункт GROUP BY. Требуется для использования агрегатных функций, таких как COUNT
+0

Спасибо, Александр! Но я действительно не думаю, что мне нужно перечислить людей без домов. Мне может понадобиться это, когда перечисляю всех людей в таблице. благодаря –

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