0

我有 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

有没有办法可以结合这三个查询?我以为我有一个可行的解决方案,但今天发现它丢失了一些数据。

认为有效但无效的查询如下

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,所以一些更高级的功能,比如连接,目前有点超出我的想象。

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

4

5 回答 5

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
于 2017-06-21T16:30:34.930 回答
0

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

.Person_has_trip.Person_idPerson

应该

Person_has_trip.Person_idPerson

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

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

如果这不能解决它,您使用的是什么平台?MSQL,甲骨文?

于 2017-06-21T16:17:41.447 回答
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
于 2017-06-21T16:24:12.513 回答
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
于 2017-06-21T16:28:25.737 回答
0

xQbert 明白了。

Person_has_trip 表缺少数据,因此查询缺少旅行,因为它没有在 Person_has_trip 中正确列出。

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

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

于 2017-06-21T16:31:49.350 回答