[英]SQL Joining Multiple Tables mySQL
Hey Guys I need Help with an SQL statement. 嗨,我需要SQL语句的帮助。 There are 5 tables total and I need to join multiple tables for a SELECT statement.
总共有5个表,我需要为SELECT语句连接多个表。 These are the tables:
这些是表格:
+-----------+------------+------------+
| 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 |
+-----------+------------+
The problem: Construct the SQL statement to find all the meetings that Tom Hanks has to attend. 问题:构造SQL语句以查找Tom Hanks必须参加的所有会议。 Display the following columns: Person's first name Person's last name Building name Room number Meeting start date and time Meeting end date and time
显示以下各列:人员的名字人员的名字建筑物名称房间号会议开始日期和时间会议结束日期和时间
My statement: 我的声明:
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;
RESULT: 结果:
+------------+-----------+---------------+-------------+---------------------+---------------------+
| 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 has multiple meetings.(4 to be exact) How do I show the 4 meetings? 汤姆·汉克斯(Tom Hanks)有多个会议。(准确地说是4个会议)如何显示这4个会议? Not sure what to do here.
不知道在这里做什么。 It is only showing 1 with my statement.
我的陈述只显示1。
This query should give you what you want (barring any spelling mistakes :P!) 此查询应为您提供所需的内容(除非出现任何拼写错误: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
With this query you are joining the tables on the relationships you've created. 通过此查询,您可以将表连接到已创建的关系上。 A person is linked to meeting via
meeting.person_id = person.person_id
a meeting is linked to a room via room.room_id = meeting.room_id
and a room is linked to a building via building.building_id = room.room_id
then finally filtering down these to only show where person.person_id = 1
一个人通过
room.room_id = meeting.room_id
连接到room.room_id = meeting.room_id
meeting.person_id = person.person_id
一个会议通过room.room_id = meeting.room_id
连接到一个房间room.room_id = meeting.room_id
,一个房间通过building.building_id = room.room_id
连接到一个建筑物,最后过滤掉这些只显示哪里person.person_id = 1
The issue with your query was you tried to join everything onto person via person_id 您查询的问题是您尝试通过person_id将所有内容加入人
JOIN building ON person.person_id = building.building_id +-------------+----------------------+ | building_id | building_name | +-------------+----------------------+ | 1 | Headquarters |<- | 2 | Main Street Building | +-------------+----------------------+
JOIN building ON person.person_id = building.building_id +-------------+----------------------+ | building_id | building_name | +-------------+----------------------+ | 1 | Headquarters |<- | 2 | Main Street Building | +-------------+----------------------+
from this table we will only get building_id = 1 从该表中
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 | +---------+-------------+-------------+----------+
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 | +---------+-------------+-------------+----------+
from this table we will only get room_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 | +------------+---------+---------------------+---------------------+
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 | +------------+---------+---------------------+---------------------+
from this table we can see we will only get meeting_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
Primary Keys/Foreign Keys 主键/外键
Was able to find a solution. 能够找到解决方案。 JOIN was not needed...
不需要加入...
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';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.