ソリューション1:Doctrine Native SQL
これを実現する1つの方法は、ネイティブMySQLクエリを使用することです。これには、DoctrineのネイティブSQL ResultSetMapping 。
ネイティブSQLクエリを(異なるパラメーターで)2回実行すると、2番目のクエリの結果セットが最初のクエリと同じであるという問題が発生しました。
解決策2:MySQLの内部オプティマイザーを使用する
次の結合条件を使用すると、MySQLの内部オプティマイザが使用され、これが ref_or_null
参加タイプ
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
その後、この結合条件をDQLで使用することができます。これは、SQLで適切に変換され、最適化されます。
解決策3:カスタムDQL関数を作成する
次の句で翻訳されたカスタムDQL関数を作成しました:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
残念ながら、= 1
を取り除くことができませんでした この条項の一部。これは機能しましたが、メジャーを引き起こしました 私のクエリに対するパフォーマンスの影響:17秒対0.5秒、いくつかの(非科学的な)指標を与えるため。
それで私はその道をさらに進んでいませんでした。