2017-09-06 81 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