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

Doktrin DQL join på nullable kolonner

Løsning 1:Doktrin Native SQL

En måde at opnå dette på er ved at bruge native MySQL-forespørgsler. Dette kræver brug af Doktrinens oprindelige SQL funktion og kortlægning af resultaterne af forespørgslen ved hjælp af en ResultSetMapping .

Jeg stødte på et problem, da jeg udførte en Native SQL-forespørgsel to gange (med forskellige parametre), at den anden forespørgsels resultatsæt var det samme som det første.Følgende indlæg på GitHub løste dette for mig.

Løsning 2:Brug af MySQL's interne optimizer

Brug af følgende join-betingelse vil bruge MySQL's interne optimizer og behandle dette som en ref_or_null join-type

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

Det er så muligt at bruge denne join-betingelse i DQL, som vil blive oversat pænt til SQL for at blive optimeret.

Løsning 3:Skriv brugerdefineret DQL-funktion

Jeg skrev en brugerdefineret DQL-funktion, der er oversat til følgende klausul:

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

Desværre var det ikke i stand til at slippe af med = 1 del af denne klausul. Dette virkede, men forårsagede en større ydeevnepåvirkning på min forespørgsel:17s vs. 0,5s, for at give en (ikke-videnskabelig) indikation.
Så jeg gik ikke længere ad den vej.




  1. Sådan øges maksimale forbindelser i PostgreSQL

  2. zf2 tablegateway vælg kolonner efter kolonnenavn

  3. udskrivning af en værdi af en variabel i postgresql

  4. CEILING() Eksempler i SQL Server