sql >> Database >  >> RDS >> Mysql

Doctrine DQL join op nullable kolommen

Oplossing 1:Doctrine Native SQL

Een manier om dit te bereiken is door native MySQL-query's te gebruiken. Hiervoor is het gebruik van Native SQL van de leer functie en het in kaart brengen van de resultaten van de zoekopdracht met behulp van een ResultSetMapping .

Ik kwam een ​​probleem tegen bij het tweemaal uitvoeren van een Native SQL-query (met verschillende parameters), dat de resultatenset van de tweede query hetzelfde was als de eerste.Volgend bericht op GitHub heeft dit voor mij opgelost.

Oplossing 2:gebruik van de interne optimizer van MySQL

Als u de volgende join-voorwaarde gebruikt, wordt de interne optimizer van MySQL gebruikt en wordt deze behandeld als een ref_or_null join-type

SELECT a.*, b.* 
FROM a
   INNER JOIN b ON 
       a.column = b.column 
       OR (a.column IS NULL AND b.column IS NULL)

Het is dan mogelijk om deze join-voorwaarde in DQL te gebruiken, die mooi vertaald zal worden in SQL om te optimaliseren.

Oplossing 3:schrijf een aangepaste DQL-functie

Ik heb een aangepaste DQL-functie geschreven die vertaald werd in de volgende clausule:

SELECT a.*, b.* 
FROM a
   INNER JOIN b ON (a.column <=> b.column) = 1

Helaas is het niet gelukt om de = 1 . te verwijderen onderdeel van deze clausule. Dit werkte, maar veroorzaakte een grote prestatie-impact op mijn vraag:17s versus 0,5s, om een ​​(niet-wetenschappelijke) indicatie te geven.
Dus ik ging niet verder op die weg.




  1. Een databasemodel ontwerpen voor een bioscoopreserveringssysteem

  2. MySQL-transactiejournaal bijhouden

  3. blob omzetten in clob

  4. Beginnen met bloggen voor HTML5 en CSS3