使用内连接合并 3 个查询
Combine 3 queries using inner join
我尝试从 3 个表中提取信息。示例数据如下所示
TABLE Trip
idTrip Title Date
1 Ben Lomond 08-08-2016
TABLE Person_has_trip
Trip_idTrip Person_idPerson
1 1
1 2
TABLE Person
idPerson Forename Surname
1 David Jack
2 Colin McAlpine
我正在尝试获取每次旅行的名称以及参加该旅行的每个人的姓名。
另外,查询看起来像这样
1. SELECT idTrip, title, Date from Trip
2. SELECT Person_idPerson from Person_has_Trip where Trip_idTrip = $idTrip
3. SELECT forename, surname from person where idPerson = $idPerson
有什么方法可以组合这 3 个查询吗?我以为我有一个可行的解决方案,但今天发现它缺少一些数据。
我认为的查询有效但无效低于
select trip.idTrip, trip.title, trip.date, Person_has_Trip.Person_idPerson, person.forename, person.surname
from trip
inner join
Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
inner join
person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
任何建议都非常好。我目前正在学习 SQL,因此一些更高级的功能(如连接)目前有点超出我的理解范围。
当我说它不起作用时,它并没有显示我期望的所有数据。它显示了一些,但不是全部。
如果这是一个快速的答案,您还有一个额外的 .在查询中。
.Person_has_trip.Person_idPerson
应该是
Person_has_trip.Person_idPerson
此外,请注意字符大小写。在许多平台中,这对于列和 table 名称很重要。请注意,您同时使用 Person 和 person 来指代 table.
https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
如果这不能解决问题,您使用的是什么平台? MSQL、甲骨文?
会return如你所愿:
Returns两行
CREATE Table Trip
( idTrip int
,Title varchar(20)
,Date date
)
;
CREATE Table Person_has_trip
( Trip_idTrip int
,Person_idPerson int
)
;
CREATE TABLE Person
( idPerson int
,Forename varchar(20)
,Surname varchar(20)
);
INSERT INTO Trip VALUES (1, 'Ben Lomond', '2016-08-08' );
INSERT INTO Person_has_trip VALUES (1, 1);
INSERT INTO Person_has_trip VALUES (1, 2);
INSERT INTO Person VALUES (1, 'David', 'Jack')
INSERT INTO Person VALUES (2, 'Colin', 'McAlpine')
SELECT idTrip
,Title
,Date
,Person_idPerson
,Forename
,Surname
FROM Trip
INNER JOIN Person_has_trip
ON Trip_idTrip = idTrip
INNER JOIN Person
ON Person_idPerson = idPerson
Returns:
idTrip Title Date Person_idPerson Forename Surname
1 Ben Lomond 2016-08-08 1 David Jack
1 Ben Lomond 2016-08-08 2 Colin McAlpine
您可以使用引用 table "TABLE Person_has_trip" 作为基础,从 Person 和 Trip table 中获取您想要的值。您可以随心所欲地操纵 table 来显示您 want/don 不想要的内容
这更容易理解 JOINS 的工作原理。这个视觉指南总是有用的:
https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
SELECT a.Trip_idTrip ,
a.Person_idPerson,
b.Forname,
b.Surname,
c.Title,
d.Date
FROM Person_has_trip a
--Join here to get their names based on person_id
JOIN (SELECT idperson,
forename,
surname
From Person) b on b.idperson = a.Person_idPerson
--Join here to get their trip information based on trip ID
JOIN (SELECT idtrip,
title,
date
From Trip) c on c.idtrip= a.Trip_idTrip
也许问题在于您想要查看所有行程,而不管他们是否有人。在这种情况下您可以使用左连接
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
LEFT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
LEFT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
或者您想见所有的人,即使他们没有出差...
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
RIGHT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
RIGHT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
或者两者都...(mySQL 不支持完全外部连接,所以我们模拟它)
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
LEFT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
LEFT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
UNION
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
RIGHT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
RIGHT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
xQbert 知道了。
Person_has_trip table 缺少数据,因此查询缺少行程,因为它没有在 Person_has_trip 中正确列出。
感谢您的帮助。一旦人们开始说我的查询看起来不错并且应该可以工作,我就一定是数据出了问题。
太好了,再次感谢您! :)
我尝试从 3 个表中提取信息。示例数据如下所示
TABLE Trip
idTrip Title Date
1 Ben Lomond 08-08-2016
TABLE Person_has_trip
Trip_idTrip Person_idPerson
1 1
1 2
TABLE Person
idPerson Forename Surname
1 David Jack
2 Colin McAlpine
我正在尝试获取每次旅行的名称以及参加该旅行的每个人的姓名。 另外,查询看起来像这样
1. SELECT idTrip, title, Date from Trip
2. SELECT Person_idPerson from Person_has_Trip where Trip_idTrip = $idTrip
3. SELECT forename, surname from person where idPerson = $idPerson
有什么方法可以组合这 3 个查询吗?我以为我有一个可行的解决方案,但今天发现它缺少一些数据。
我认为的查询有效但无效低于
select trip.idTrip, trip.title, trip.date, Person_has_Trip.Person_idPerson, person.forename, person.surname
from trip
inner join
Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
inner join
person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
任何建议都非常好。我目前正在学习 SQL,因此一些更高级的功能(如连接)目前有点超出我的理解范围。
当我说它不起作用时,它并没有显示我期望的所有数据。它显示了一些,但不是全部。
如果这是一个快速的答案,您还有一个额外的 .在查询中。
.Person_has_trip.Person_idPerson
应该是
Person_has_trip.Person_idPerson
此外,请注意字符大小写。在许多平台中,这对于列和 table 名称很重要。请注意,您同时使用 Person 和 person 来指代 table.
https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
如果这不能解决问题,您使用的是什么平台? MSQL、甲骨文?
会return如你所愿: Returns两行
CREATE Table Trip
( idTrip int
,Title varchar(20)
,Date date
)
;
CREATE Table Person_has_trip
( Trip_idTrip int
,Person_idPerson int
)
;
CREATE TABLE Person
( idPerson int
,Forename varchar(20)
,Surname varchar(20)
);
INSERT INTO Trip VALUES (1, 'Ben Lomond', '2016-08-08' );
INSERT INTO Person_has_trip VALUES (1, 1);
INSERT INTO Person_has_trip VALUES (1, 2);
INSERT INTO Person VALUES (1, 'David', 'Jack')
INSERT INTO Person VALUES (2, 'Colin', 'McAlpine')
SELECT idTrip
,Title
,Date
,Person_idPerson
,Forename
,Surname
FROM Trip
INNER JOIN Person_has_trip
ON Trip_idTrip = idTrip
INNER JOIN Person
ON Person_idPerson = idPerson
Returns:
idTrip Title Date Person_idPerson Forename Surname
1 Ben Lomond 2016-08-08 1 David Jack
1 Ben Lomond 2016-08-08 2 Colin McAlpine
您可以使用引用 table "TABLE Person_has_trip" 作为基础,从 Person 和 Trip table 中获取您想要的值。您可以随心所欲地操纵 table 来显示您 want/don 不想要的内容
这更容易理解 JOINS 的工作原理。这个视觉指南总是有用的: https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
SELECT a.Trip_idTrip ,
a.Person_idPerson,
b.Forname,
b.Surname,
c.Title,
d.Date
FROM Person_has_trip a
--Join here to get their names based on person_id
JOIN (SELECT idperson,
forename,
surname
From Person) b on b.idperson = a.Person_idPerson
--Join here to get their trip information based on trip ID
JOIN (SELECT idtrip,
title,
date
From Trip) c on c.idtrip= a.Trip_idTrip
也许问题在于您想要查看所有行程,而不管他们是否有人。在这种情况下您可以使用左连接
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
LEFT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
LEFT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
或者您想见所有的人,即使他们没有出差...
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
RIGHT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
RIGHT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
或者两者都...(mySQL 不支持完全外部连接,所以我们模拟它)
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
LEFT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
LEFT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
UNION
SELECT trip.idTrip
, trip.title
, trip.date
, Person_has_Trip.Person_idPerson
, person.forename
, person.surname
FROM trip
RIGHT JOIN Person_has_Trip
on trip.idTrip = Person_has_Trip.trip_idTrip
RIGHT JOIN person
on Person_has_Trip.Person_idPerson = person.idPerson
ORDER BY trip.date
xQbert 知道了。
Person_has_trip table 缺少数据,因此查询缺少行程,因为它没有在 Person_has_trip 中正确列出。
感谢您的帮助。一旦人们开始说我的查询看起来不错并且应该可以工作,我就一定是数据出了问题。
太好了,再次感谢您! :)