Mysql
 sql >> Base de données >  >> RDS >> Mysql

Jointure Doctrine DQL sur des colonnes nullables

Solution 1 :Doctrine SQL natif

Une façon d'y parvenir est d'utiliser des requêtes MySQL natives. Cela nécessite l'utilisation de SQL natif de Doctrine fonctionnalité et cartographier les résultats de la requête à l'aide d'un ResultSetMapping .

J'ai rencontré un problème lors de l'exécution d'une requête SQL native deux fois (avec des paramètres différents), à savoir que le jeu de résultats de la deuxième requête était le même que le premier.Poste suivant sur GitHub résolu cela pour moi.

Solution 2 :Utiliser l'optimiseur interne de MySQL

L'utilisation de la condition de jointure suivante utilisera l'optimiseur interne de MySQL et la traitera comme un ref_or_null type de jointure

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

Il est alors possible d'utiliser cette condition de jointure en DQL, qui sera joliment traduite en SQL pour être optimisée.

Solution 3 :Écrire une fonction DQL personnalisée

J'ai écrit une fonction DQL personnalisée qui s'est traduite dans la clause suivante :

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

Malheureusement, il n'a pas été en mesure de se débarrasser du = 1 partie de cette clause. Cela a fonctionné, mais a causé un majeur impact sur les performances de ma requête :17 s contre 0,5 s, pour donner une indication (non scientifique).
Je ne suis donc pas allé plus loin dans cette voie.