为MySQL中的每个人计算房屋

时间:2016-01-14 02:17:37

标签: mysql sql

我有两张桌子:人和房子。 每个人都有姓名,电子邮件和电话号码,而房子有许多房间和城市位置。 我必须展示每个人的名字和一些房屋,房屋的数量是一个人拥有的房屋数量。

这似乎是一对多的关系。 所以这是我对Person Table的查询:

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)那就是它。

当我第一次想到它时,它很容易构建,我不知道为什么我会浪费这么多时间。有什么帮助吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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
  • 等聚合函数时需要