Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Junção DQL do Doctrine em colunas anuláveis

Solução 1:Doctrine Native SQL


Uma maneira de conseguir isso é usando consultas nativas do MySQL. Isso requer o uso de SQL nativo do Doctrine recurso e mapear os resultados da consulta usando um Mapeamento do conjunto de resultados .

Eu me deparei com um problema ao executar uma consulta SQL nativa duas vezes (com parâmetros diferentes), que o conjunto de resultados da segunda consulta era o mesmo que o primeiro.Seguinte postagem no GitHub resolveu isso para mim.

Solução 2:usando o otimizador interno do MySQL


O uso da seguinte condição de junção usará o otimizador interno do MySQL e tratará isso como um ref_or_null tipo de junção
SELECT a.*, b.* 
FROM a
   INNER JOIN b ON 
       a.column = b.column 
       OR (a.column IS NULL AND b.column IS NULL)

É então possível usar esta condição de junção em DQL, que será bem traduzida em SQL para ser otimizada.

Solução 3:escreva a função DQL personalizada


Eu escrevi uma função DQL personalizada que traduziu na seguinte cláusula:
SELECT a.*, b.* 
FROM a
   INNER JOIN b ON (a.column <=> b.column) = 1

Infelizmente não foi possível se livrar do = 1 parte desta cláusula. Isso funcionou, mas causou um grande impacto de desempenho na minha consulta:17s vs 0.5s, para dar alguma indicação (não científica).
Então eu não fui mais longe nesse caminho.