sql >> Base de Datos >  >> RDS >> Mysql

Unión de Doctrine DQL en columnas anulables

Solución 1:SQL nativo de Doctrine

Una forma de lograr esto es mediante el uso de consultas MySQL nativas. Esto requiere el uso de SQL nativo de Doctrine característica y mapear los resultados de la consulta usando un Asignación de conjunto de resultados .

Encontré un problema al ejecutar una consulta Native SQL dos veces (con diferentes parámetros), que el conjunto de resultados de la segunda consulta era el mismo que el primero. Siguiente publicación en GitHub resolvió esto para mí.

Solución 2:usar el optimizador interno de MySQL

El uso de la siguiente condición de combinación utilizará el optimizador interno de MySQL y lo tratará como un ref_or_null tipo de unión

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

Entonces es posible usar esta condición de unión en DQL, que se traducirá muy bien en SQL para optimizarse.

Solución 3:Escribir función DQL personalizada

Escribí una función DQL personalizada que se tradujo en la siguiente cláusula:

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

Desafortunadamente, no fue posible deshacerse del = 1 parte de esta cláusula. Esto funcionó, pero causó un importante impacto en el rendimiento de mi consulta:17 s frente a 0,5 s, para dar alguna indicación (no científica).
Así que no profundicé en ese camino.