sql >> Databáze >  >> RDS >> Mysql

Doctrine DQL spojení na sloupcích s možnou hodnotou Null

Řešení 1:Doctrine Native SQL

Jedním ze způsobů, jak toho dosáhnout, je použití nativních dotazů MySQL. To vyžaduje použití Nativní SQL doktríny funkce a mapování výsledků dotazu pomocí ResultSetMapping .

Při provádění nativního SQL dotazu dvakrát (s různými parametry) jsem narazil na problém, že sada výsledků druhého dotazu byla stejná jako první.Sledování příspěvku na GitHubu vyřešil to za mě.

Řešení 2:Použití interního optimalizátoru MySQL

Použití následující podmínky spojení použije interní optimalizátor MySQL a bude to považovat za ref_or_null typ spojení

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

Pak je možné použít tuto podmínku spojení v DQL, která bude pěkně přeložena do SQL, aby byla optimalizována.

Řešení 3:Napište vlastní funkci DQL

Napsal jsem vlastní funkci DQL, která přeložila následující klauzuli:

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

Bohužel se nepodařilo zbavit = 1 součástí tohoto ustanovení. To fungovalo, ale způsobilo to závažné dopad na výkon na můj dotaz:17 s vs 0,5 s, abych uvedl nějaký (nevědecký) údaj.
Takže jsem touto cestou nešel dále.




  1. uložit TEXT/BLOB do stejné tabulky nebo ne?

  2. Nelze se připojit přímo z Androidu k SQL Serveru

  3. Použití CHOP ve výuce

  4. provádění operací souvisejících s datem v PHP