sql >> Databasteknik >  >> RDS >> Mysql

Doctrine DQL join på nullbara kolumner

Lösning 1:Doctrine Native SQL

Ett sätt att uppnå detta är att använda inbyggda MySQL-frågor. Detta kräver användning av Doktrinens ursprungliga SQL funktion och kartläggning av resultaten av frågan med en ResultSetMapping .

Jag stötte på ett problem när jag körde en Native SQL-fråga två gånger (med olika parametrar), att den andra frågans resultatuppsättning var densamma som den första.Följande inlägg på GitHub löste detta åt mig.

Lösning 2 :Använder MySQL:s interna optimizer

Om du använder följande anslutningsvillkor kommer att använda MySQL:s interna optimerare och behandla detta som en ref_or_null join-typ

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

Det är sedan möjligt att använda detta join-villkor i DQL, som kommer att översättas snyggt till SQL för att optimeras.

Lösning 3:Skriv anpassad DQL-funktion

Jag skrev en anpassad DQL-funktion som översattes i följande klausul:

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

Tyvärr kunde den inte bli av med = 1 del av denna klausul. Detta fungerade, men orsakade en stor prestandapåverkan på min fråga:17s vs 0,5s, för att ge någon (icke-vetenskaplig) indikation.
Så jag gick inte längre på den vägen.




  1. Mysql-utlösare för att uppdatera den infogade raden

  2. Kan Django ORM göra en ORDER BY på ett specifikt värde i en kolumn?

  3. Felkod:1292. Trunkerat felaktigt DUBBELt värde:'ja'

  4. Jämför fyra ledande databas-IDE-verktyg