2017-09-06 121 views
0

我有三(3)表:MySQL的左连接不工作

  • vehicle表: Vehicle table

  • userCarMapping表: userCarMapping

  • userInfouserInfo

我想如果车辆被映射到用户userCarMapping表,从表vehiclefirstnamelast nameuserInfo表中获取所有车辆。

我写此查询:

SELECT `vehicle`.`vehicleId`, `vehicle`.`modelId`, `vehicle`.`RegNo`, `userInfo`.`firstName`, `userInfo`.`lastName` 
FROM `vehicle` 
LEFT JOIN `userCarMapping` ON `vehicle`.`vehicleId` = `userCarMapping`.`vehicleId` 
LEFT JOIN `userInfo` ON `userCarMapping`.`userId` = `userInfo`.`userId` 
WHERE `vendorUserId` = '1' AND `vehicle`.`status` = 'approved' AND `userInfo`.`status` = 'approved'` 

和我得到这个输出,其中,因为我希望所有的车辆从vehicle表。

output

+0

[MySQL](https://dev.mysql.com/doc/refman/5.7/en/)和[SQL Server](https://docs.microsoft.com/zh-cn/sql/t -sql/language-reference)是不同公司生产的不同软件包。即使它们都实现SQL,它们也会以不同的方式扩展它们,有时它们会使用不同的语法约定来使查询之间的查询不兼容。请仅使用与您使用的软件相匹配的标签。 – axiac

+1

'AND userInfo.status ='approved'':这会将你的'left join'变成'inner join'。将此条件移至连接条件。 – HoneyBadger

+0

建议:用'AND'替换WHERE' –

回答

1

当您使用whereuserinfo表条件,那么它只返回那些满足condition.But如果您使用userinfo条件加入,而不是在那里行,那么表连接满足类似条件的行它有userinfo表中的5条记录和status active只有两条记录然后连接只考虑这2条连接。

试试下面的查询:

SELECT `vehicle`.`vehicleId`, `vehicle`.`modelId`, `vehicle`.`RegNo`, `userInfo`.`firstName`, `userInfo`.`lastName` 
FROM `vehicle` 
LEFT JOIN `userCarMapping` ON `vehicle`.`vehicleId` = `userCarMapping`.`vehicleId` 
LEFT JOIN `userInfo` ON `userCarMapping`.`userId` = `userInfo`.`userId` AND `userInfo`.`status` = 'approved'` 
WHERE `vendorUserId` = '1' AND `vehicle`.`status` = 'approved' 

希望你能理解的答案。

+0

您的查询正在工作,但为什么我的工作不正常?你在哪里只有userInfo条件。请解释。 ??? –

+0

@NilkamalGotarne,当你在'where'条款中考虑那些条件时,它会考虑那些状态是活动的记录。而就我而言,它只会考虑那些状态对于Join而言是有效的记录。 –

1

我相信你的问题在于你的查询的位置。

SELECT 
    vehicle.vehicleId, 
    vehicle.modelId, 
    vehicle.RegNo, 
    userInfo.firstName, 
    userInfo.lastName 
FROM 
    vehicle 
LEFT JOIN userCarMapping ON vehicle.vehicleId=userCarMapping.vehicleId 
LEFT JOIN userInfo ON serCarMapping.userId=userInfo.userId 
WHERE vendorUserId= '1' 
AND vehicle.status= 'approved' 
AND userInfo.status= 'approved' 

基本上,如果用户不存在的车辆,它仍然在寻找用户信息表与批准。如果你删除

AND userInfo.status= 'approved' 

你是否得到了你想要的信息?

+0

是的,删除'AND userInfo.status ='approved''正常工作。但那我怎么才能达到预期的效果 –

+0

你可以简单地移动 AND userInfo.status = '批准' 向左加入成为这样 LEFT JOIN USERINFO ON serCarMapping.userId = userInfo.userId 和用户信息。状态='批准' 基本上这说'给我的车辆和他们的状态批准的用户,他们排队到用户ID。 VS '如果用户不喜欢up userInfo.status等于NULL,那么给我车辆和用户ID排队的用户,其中车辆和userInfo状态=批准。 – Crawdingle