Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Doctrine-DQL-Join für Nullable-Spalten

Lösung 1:Doctrine Native SQL

Eine Möglichkeit, dies zu erreichen, ist die Verwendung nativer MySQL-Abfragen. Dies erfordert die Verwendung von Natives SQL von Doctrine -Funktion und Zuordnen der Ergebnisse der Abfrage mithilfe eines Ergebnissatzzuordnung .

Ich bin auf ein Problem gestoßen, als ich eine Native SQL-Abfrage zweimal (mit unterschiedlichen Parametern) ausgeführt habe, dass die Ergebnismenge der zweiten Abfrage dieselbe war wie die der ersten.Folgender Beitrag auf GitHub hat das für mich gelöst.

Lösung 2:Verwenden des internen Optimierers von MySQL

Die Verwendung der folgenden Join-Bedingung verwendet den internen Optimierer von MySQL und behandelt dies als ref_or_null Join-Typ

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

Es ist dann möglich, diese Join-Bedingung in DQL zu verwenden, die zur Optimierung gut in SQL übersetzt wird.

Lösung 3:Benutzerdefinierte DQL-Funktion schreiben

Ich habe eine benutzerdefinierte DQL-Funktion geschrieben, die in die folgende Klausel übersetzt wurde:

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

Leider war es nicht möglich, das = 1 loszuwerden Teil dieser Klausel. Dies funktionierte, verursachte aber einen Major Auswirkungen auf die Leistung bei meiner Abfrage:17 Sekunden gegenüber 0,5 Sekunden, um einen (nicht wissenschaftlichen) Hinweis zu geben.
Also bin ich diesen Weg nicht weiter gegangen.