我有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,所以目前有一些像连接这样的高级功能有点过头了。
当我说它不起作用时,它不会显示我期望的所有数据。它显示了一些,但不是全部。
答案 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)
Person_has_trip表缺少数据,因此查询失踪,因为它未在Person_has_trip中正确列出。
感谢您的帮助。一旦人们开始说我的查询看起来很好并且它应该工作,我就不得不对数据做错了。
非常好,再次感谢你! :)