2017-09-06 1 views
0

Ich habe drei (3) Tische:MYSQL LEFT JOIN nicht funktioniert

  • vehicle Tabelle: Vehicle table

  • userCarMapping Tabelle: userCarMapping

  • userInfo Tisch userInfo

Ich möchte alle Fahrzeuge von vehicle Tisch und firstname und last name von userInfo Tisch bekommen, wenn ein Fahrzeug an einen Benutzer in userCarMapping Tabelle abgebildet wird.

Ich schrieb diese Anfrage:

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'` 

und ich diese Ausgabe bekommen, wo ich alle Fahrzeuge von vehicle Tabelle wollen.

output

+0

[MySQL] (https://dev.mysql.com/doc/refman/5.7/en/) und, [SQL Server] (https://docs.microsoft.com/en-us/sql/t -sql/Sprachreferenz) sind verschiedene Softwarepakete, die von verschiedenen Firmen erstellt werden. Selbst wenn beide SQL implementieren, erweitern sie es auf verschiedene Arten und manchmal verwenden sie unterschiedliche Syntaxkonventionen, die die Abfragen zwischen ihnen inkompatibel machen. Bitte verwenden Sie nur die Tags, die zu der von Ihnen verwendeten Software passen. – axiac

+1

'AND userInfo.status = 'approved'': Dies macht Ihren' linken Join' zu einem 'inneren Join'. Verschieben Sie diese Bedingung in die Join-Bedingung. – HoneyBadger

+0

TIPP: Ersetzen Sie "WHERE" durch "UND" –

Antwort

1

Wenn Sie userinfo Tabellenbedingung in where verwenden dann nur er diese Zeilen zurück, die die condition.But erfüllen, wenn Sie verwenden, dass userinfo Bedingung mitmachen statt, wo, dann Tabellenzeilen verbinden, die die Bedingung erfüllen, wie es gibt 5 Datensätze in userinfo Tabelle und Datensätze mit status active nur zwei dann beitreten beachten Sie nur diese 2 Zeilen für die Join.

Versuchen unter Abfrage:

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' 

Hoffe, dass Sie die Antwort zu verstehen.

+0

Ihre Abfrage funktioniert, aber warum funktioniert meine nicht? Sie hatten vorher nur die userInfo-Bedingung. bitte erkläre. ??? –

+0

@NilkamalGotarne, wenn Sie diese Bedingung in 'where' -Klausel schreiben, dass es diese Datensätze in Betracht ziehen, deren Status aktiv ist. Und in meinem Fall berücksichtigt es nur diejenigen Datensätze, deren Status für den Join aktiv ist. –

1

Ich glaube, Ihr Problem liegt in der WO Ihrer Abfrage.

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' 

Grundsätzlich, wenn ein Benutzer existiert nicht für ein Fahrzeug es noch ist für die Userinfotabelle sucht mit einem genehmigt. Wenn Sie entfernen

AND userInfo.status= 'approved' 

Erhalten Sie die gewünschten Informationen?

+0

ja nach dem Entfernen 'UND userInfo.status = 'genehmigt' funktioniert gut. aber wie kann ich dann das gewünschte Ergebnis erzielen –

+0

können Sie einfach die bewegen und userInfo.status = ‚genehmigt‘ nach links kommen als so LEFT JOIN ON serCarMapping.userId userinfo = userInfo.userId UND userinfo. status = 'approved' Im Grunde sagt das: 'Geben Sie mir die Fahrzeuge und die Benutzer, wo ihr Status genehmigt ist, und sie ordnen sich mit einer Benutzer-ID. VS 'Geben Sie mir die Fahrzeuge und die Benutzer, wo die Benutzer-ID ausgerichtet WHERE das Fahrzeug und der userInfo-Status = genehmigt, wenn ein Benutzer nicht gerne BenutzerInfo.status gleich NULL ist, so schließt es aus. – Crawdingle