Mysql
 sql >> Database >  >> RDS >> Mysql

Doctrine DQL join su colonne nullable

Soluzione 1:Dottrina SQL nativo

Un modo per raggiungere questo obiettivo è utilizzare query MySQL native. Ciò richiede l'uso di SQL nativo di Doctrine funzionalità e mappatura dei risultati della query utilizzando un ResultSetMapping .

Ho riscontrato un problema durante l'esecuzione di una query SQL nativa due volte (con parametri diversi), che il set di risultati della seconda query era lo stesso della prima.Post successivo su GitHub risolto per me.

Soluzione 2:utilizzo dell'ottimizzatore interno di MySQL

L'utilizzo della seguente condizione di join utilizzerà l'ottimizzatore interno di MySQL e lo tratterà come un ref_or_null tipo di unione

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

È quindi possibile utilizzare questa condizione di join in DQL, che verrà tradotta correttamente in SQL per essere ottimizzata.

Soluzione 3:scrivere la funzione DQL personalizzata

Ho scritto una funzione DQL personalizzata che è stata tradotta nella seguente clausola:

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

Purtroppo non è stato possibile eliminare il = 1 parte di questa clausola. Questo ha funzionato, ma ha causato un importante impatto sulle prestazioni sulla mia query:17s vs 0,5s, per dare qualche indicazione (non scientifica).
Quindi non sono andato oltre su quella strada.