使用内部联接组合3个查询

时间:2017-06-21 16:13:10

标签: sql join inner-join multi-table multiple-select-query

我有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,所以目前有一些像连接这样的高级功能有点过头了。

当我说它不起作用时,它不会显示我期望的所有数据。它显示了一些,但不是全部。

5 个答案:

答案 0 :(得分:1)

也许问题是你想看看所有的旅行,无论他们有没有人。在这种情况下,您可以使用左连接

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

答案 1 :(得分:0)

如果这是一个快速回答,你还有一个额外的答案。在查询中。

.Person_has_trip.Person_idPerson

应该是

Person_has_trip.Person_idPerson

另外,观看角色案例。在许多平台中,这对于列和表名称很重要。请注意,您同时使用Person和person来引用该表。

https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html

如果不能解决问题,您使用的是什么平台? MSQL,Oracle?

答案 2 :(得分:0)

将按您的意愿返回: 返回两行

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

返回:

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

答案 3 :(得分:0)

您可以使用引用表“TABLE Person_has_trip”作为基础,从Person和Trip表中获取所需的值。您可以根据需要操作表格来显示您想要/不想要的内容

这对于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

答案 4 :(得分:0)

xQbert得到了它。

Person_has_trip表缺少数据,因此查询失踪,因为它未在Person_has_trip中正确列出。

感谢您的帮助。一旦人们开始说我的查询看起来很好并且它应该工作,我就不得不对数据做错了。

非常好,再次感谢你! :)