【问题标题】:SQL Joining Multiple Tables mySQLSQL 连接多个表 mySQL
【发布时间】:2018-06-19 01:34:50
【问题描述】:

大家好,我需要有关 SQL 语句的帮助。总共有 5 个表,我需要为 SELECT 语句连接多个表。 这些是表格:

+-----------+------------+------------+
| person_id | first_name | last_name  |
+-----------+------------+------------+
|         1 | Tom        | Hanks      |
|         2 | Anne       | Hathaway   |
|         3 | Tom        | Cruise     |
|         4 | Meryl      | Streep     |
|         5 | Chris      | Pratt      |
|         6 | Halle      | Berry      |
|         7 | Robert     | De Niro    |
|         8 | Julia      | Roberts    |
|         9 | Denzel     | Washington |
|        10 | Melissa    | McCarthy   |
+-----------+------------+------------+

+-------------+----------------------+
| building_id | building_name        |
+-------------+----------------------+
|           1 | Headquarters         |
|           2 | Main Street Building |
+-------------+----------------------+

+---------+-------------+-------------+----------+
| room_id | room_number | building_id | capacity |
+---------+-------------+-------------+----------+
|       1 | 100         |           1 |        5 |
|       2 | 200         |           1 |        4 |
|       3 | 300         |           1 |       10 |
|       4 | 10          |           2 |        4 |
|       5 | 20          |           2 |        4 |
+---------+-------------+-------------+----------+

+------------+---------+---------------------+---------------------+
| meeting_id | room_id | meeting_start       | meeting_end         |
+------------+---------+---------------------+---------------------+
|          1 |       1 | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 |
|          2 |       1 | 2016-12-25 10:00:00 | 2016-12-25 12:00:00 |
|          3 |       1 | 2016-12-25 11:00:00 | 2016-12-25 12:00:00 |
|          4 |       2 | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 |
|          5 |       4 | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 |
|          6 |       5 | 2016-12-25 14:00:00 | 2016-12-25 16:00:00 |
+------------+---------+---------------------+---------------------+

+-----------+------------+
| person_id | meeting_id |
+-----------+------------+
|         1 |          1 |
|        10 |          1 |
|         1 |          2 |
|         2 |          2 |
|         3 |          2 |
|         4 |          2 |
|         5 |          2 |
|         6 |          2 |
|         7 |          2 |
|         8 |          2 |
|         9 |          3 |
|        10 |          3 |
|         1 |          4 |
|         2 |          4 |
|         8 |          5 |
|         9 |          5 |
|         1 |          6 |
|         2 |          6 |
|         3 |          6 |
+-----------+------------+

问题: 构造 SQL 语句以查找 Tom Hanks 必须参加的所有会议。显示以下列: 人的名字 人的姓 建筑名称 房间号 会议开始日期和时间 会议结束日期和时间

我的声明:

SELECT person.first_name, person.last_name, building.building_name,
    ->
    -> room.room_number, meeting.meeting_start, meeting.meeting_end
    ->
    -> FROM person
    ->
    -> JOIN building
    ->
    -> ON person.person_id = building.building_id
    ->
    -> JOIN room
    ->
    -> ON  person.person_id = room.room_id
    ->
    -> JOIN meeting
    ->
    -> ON person.person_id = meeting.meeting_id
    ->
    -> WHERE person_id = 1;

结果:

+------------+-----------+---------------+-------------+---------------------+---------------------+
| first_name | last_name | building_name | room_number | meeting_start       | meeting_end         |
+------------+-----------+---------------+-------------+---------------------+---------------------+
| Tom        | Hanks     | Headquarters  | 100         | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 |
+------------+-----------+---------------+-------------+---------------------+---------------------+

Tom Hanks 有多个会议。(确切地说是 4 个)如何显示这 4 个会议?不知道在这里做什么。我的声明中只显示 1。

【问题讨论】:

  • 提示:ON person.person_id = building.building_id 之类的东西应该会响起警报。或者一个人的身份证真的可以识别建筑物吗?而且你完全忽略了最后一张桌子(你还没有透露名字),但它对于这项任务来说是一个非常重要的桌子!

标签: mysql sql


【解决方案1】:

能够找到解决方案。不需要加入...

SELECT first_name,last_name ,building_name,room_number ,meeting_start,meeting_end
FROM person P, building B,person_meeting PM,meeting M,room R
WHERE
P.person_id=PM.person_id
AND M.room_id=R.room_id
AND B.building_id=R.building_id
AND PM.meeting_id=M.meeting_id
AND P.first_name='Tom'
AND P.last_name='Hanks';

【讨论】:

  • 这仍然是隐式加入,也是非常糟糕的做法。使用inner join,如果需要,left join...这种方式构建查询长期以来未被认为是最佳实践。
  • 如何将其转换为内部联接?
  • 就像@Matt 上面的回答一样。
【解决方案2】:

这个查询应该给你你想要的(除非有任何拼写错误:P!)

SELECT person.first_name, person.last_name, building.building_name, room.room_number, meeting.meeting_start, meeting.meeting_end FROM person INNER JOIN person_meeting ON person_meeting.person_id = person.person_id INNER JOIN meeting ON meeting.meeting_id = person_meeting.meeting_id INNER JOIN room ON room.room_id = meeting.room_id INNER JOIN building on building.building_id = room.building_id WHERE person.person_id = 1

通过此查询,您将加入已创建关系的表。 一个人通过meeting.person_id = person.person_id 链接到会议,一个会议通过room.room_id = meeting.room_id 链接到一个房间,一个房间通过building.building_id = room.room_id 链接到一个建筑物,然后最后过滤这些以仅显示person.person_id = 1 的位置

您的查询的问题是您尝试通过 person_id 将所有内容加入到人员中

JOIN building ON person.person_id = building.building_id +-------------+----------------------+ | building_id | building_name | +-------------+----------------------+ | 1 | Headquarters |<- | 2 | Main Street Building | +-------------+----------------------+ 从这张表中我们只会得到 building_id = 1

JOIN room ON person.person_id = room.room_id +---------+-------------+-------------+----------+ | room_id | room_number | building_id | capacity | +---------+-------------+-------------+----------+ | 1 | 100 | 1 | 5 | <- | 2 | 200 | 1 | 4 | | 3 | 300 | 1 | 10 | | 4 | 10 | 2 | 4 | | 5 | 20 | 2 | 4 | +---------+-------------+-------------+----------+ 从这张表中我们只会得到room_id = 1

JOIN meeting ON person.person_id = meeting.meeting_id +------------+---------+---------------------+---------------------+ | meeting_id | room_id | meeting_start | meeting_end | +------------+---------+---------------------+---------------------+ | 1 | 1 | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 | <- | 2 | 1 | 2016-12-25 10:00:00 | 2016-12-25 12:00:00 | | 3 | 1 | 2016-12-25 11:00:00 | 2016-12-25 12:00:00 | | 4 | 2 | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 | | 5 | 4 | 2016-12-25 09:00:00 | 2016-12-25 10:00:00 | | 6 | 5 | 2016-12-25 14:00:00 | 2016-12-25 16:00:00 | +------------+---------+---------------------+---------------------+ 从这张表我们可以看到我们只会得到meeting_id = 1

主键/外键

  • Person.person_id 是您的 PK,meeting.person_id 是您的 FK
  • room.room_id 是您的 PK,meeting.room_id 是您的 FK
  • Building.building_id 是您的 PK,room.building_id 是您的 FK

SQL Fiddle

【讨论】:

  • 不起作用。错误 1054 (42S22):“on 子句”中的未知列“meeting.person_id”
  • 你没有给我表名,所以我不得不猜测。修改问题以命名您的表。但是应该有足够的信息来自己解决这个问题:)
  • 人、建筑、房间、会议、person_meeting。这些是按顺序排列的表名。
  • 立即尝试。在电话上,所以可能拼写错误。
  • 仅显示 3 个会议。应该是 4。天哪,这是一种痛苦
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多