使用内连接合并 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 中正确列出。

感谢您的帮助。一旦人们开始说我的查询看起来不错并且应该可以工作,我就一定是数据出了问题。

太好了,再次感谢您! :)