【发布时间】:2015-01-19 18:39:45
【问题描述】:
我在上一篇文章中得到了很多帮助,这让我更好地理解了数据库模型。我已经阅读了关于 JOINS 的教程和解释,但我似乎无法弄清楚,特此我的数据库模型;
***Person*** ***DrivingLicense*** ***DrivingLicenseLicenseTypes***
ID ID ID
Name ExpiryDate DrivingLicense_ID
Person_ID LicenseType_ID
***LicenseTypes*** ***LicenseTypeVehicleTypes*** ***VehicleTypes*** ***Vehicles***
ID ID ID ID
LicenseType LicenseType_ID VehicleType Make
VehicleType_ID Model
VehicleType_ID
Person_ID
Person: (1, 'Person1'), (2, 'Person2');
DrivingLicense: (1, '2015-01-01', 1), (2, '2015-10-01', 2);
VehicleTypes: (1, 'Car'), (2, 'Motorbike');
LicenseTypes: (1, 'Car'), (2, 'Motorbike');
Vehicles: (1, 'Ford', 'Focus', 1), (2, 'Chevrolet', 'Caprice', 1), (3, 'Ducati', 'Multistrada', 2);
LicenseTypeVehicleTypes: (1, 1, 1), (1, 1, 2), (1, 2, 2);
DrivingLicenseLicenseTypes: (1, 1, 1), (1, 2, 2);
现在我想运行一个 SELECT 查询,基本上我想链接表:
PersonID.ID -> DrivingLicense.ID
DLLT.DrivingLicense_ID -> DrivingLicense.ID
DLLT.LicenseType_ID -> LicenseTypes.ID
LTVT.LicenseType_ID -> LicenseTypes.ID
LTVT.VehicleType_ID -> VehicleTypes.ID
Vehicles.Type_ID -> Vehicletypes.ID
我试过了:
SELECT * FROM Person
INNER JOIN DrivingLicense.ID ON Person.ID = DrivingLicense.ID
INNER JOIN DrivingLicenseLicenseTypes ON DrivingLicense.ID = DrivingLicenseLicenseTypes.DrivingLicense_ID
INNER JOIN LicenseTypes ON DrivingLicenseLicenseTypes.LicenseType_ID = LicenseTypes.ID
INNER JOIN LicenseTypeVehicleTypes ON LicenseTypes.ID = LicenseTypeVehicleTypes
INNER JOIN VehicleTypes ON LicenseTypeVehicleTypes.VehicleType_ID = VehicleTypes.ID
WHERE x=y AND x=y
我认为我从错误的方式开始并犯了 Rookie 错误,我尝试从 OUTER JOIN 开始,即使它们是空白的也能得到结果。
我是不是从错误的脚开始,我需要把台阶转过来吗?
也许是为了澄清一些事情:
在我运行查询的这个页面之前,我有 2 个搜索字段,1 个对人来说是唯一的,1 个对车辆来说是唯一的。
基于这 2 个值,我正在检查它们是否匹配(检查此人是否确实是该值的所有者)。到目前为止一切顺利。
之后,我想根据我的驾照类型、车辆类型和驾照的到期日来检查此人是否可以驾驶该车辆。有踏板车驾驶执照的人不得驾驶汽车。
因此,我在此处的帮助下调整了我的数据库设置,我已经阅读了 INNER、OUTER、CROSS、LEFT JOINS 等之间的区别。但我一直在寻找缺失的链接。我认为仍然缺少一些逻辑。
如何通过适当的 JOINS 收集我需要的信息?我想避免我正在使用的情况:
SELECT table1, table2 FROM column1, column2
例如。
以下查询给了我双重结果:
SELECT *
FROM RijbewijsTypes
LEFT JOIN RijbewijstypeVoertuigtype ON RijbewijstypeVoertuigtype.RijbewijstypeID = RijbewijsTypes.ID
LEFT JOIN RijbewijsRijbewijsType ON RijbewijsRijbewijsType.RijbewijstypeID
LEFT JOIN Rijbewijs ON Rijbewijs.ID = RijbewijsRijbewijsType.RijbewijsID
LEFT JOIN Persoon ON Persoon.ID = Rijbewijs.PersoonID
LEFT JOIN Voertuig ON Voertuig.PersoonID = Persoon.ID
LEFT JOIN Merk ON Merk.ID = Voertuig.Merk
LEFT JOIN Type ON Merk.Type = Type.ID
WHERE Persoon.BSNNummer = '20230913'
AND Voertuig.Kenteken = 'NH-UN-78'
【问题讨论】:
-
是啊!
DrivingLicenseLicenseTypes! -
查询是否失败?错误? 0 个结果?结果太多?会发生什么?
-
您的 join 语句有误:还有一个 =
-
1) 仅当两个表中的记录都在连接时,内部连接才会返回数据。 2) 左连接将包括来自第一个表的记录,而不是第二个 3) 右连接将包括来自第二个表而不是第一个表的记录。 4) 完全外连接将返回两个表中的所有记录,无论连接如何。使用 where 子句可以否定连接,所以一开始不要使用它们。如果您需要限制表中的数据,请限制连接
from A inner join b on a.id = b.id and b.value='No'尝试不带 where 子句的完整外连接,然后从那里开始...... -
你加入
person.IDDrivingLicence.ID。你应该加入DrivingLicense.Person_ID。还有其他这样的错误,还有很多拼写错误,比如DrivingLice_ID而不是DrivingLicence_ID。我认为您了解连接的基本概念,但是您需要自己清除很多小错误。确保您使用的工具可以清楚地显示错误消息,这样您就不会怀疑您是否有 0 行或只是一个语法错误。
标签: mysql sql join left-join inner-join