sql >> Database teknologi >  >> RDS >> PostgreSQL

Tæl rækker efter sammenføjning af tre tabeller i PostgreSQL

For at forenkle din logik skal du samle først, slutte dig til senere.

Hvis du gætter manglende detaljer, vil denne forespørgsel give dig det nøjagtige antal, hvor mange gange hver bruger blev henvist til i table1 og table2 henholdsvis for alle brugere :

SELECT *
FROM   users u
LEFT   JOIN (
   SELECT updated_by_id AS id, count(*) AS t1_ct
   FROM   table1
   GROUP  BY 1
   ) t1 USING (id)
LEFT   JOIN (
   SELECT updated_by_id AS id, count(*) AS t2_ct
   FROM   table2
   GROUP  BY 1
   ) t2 USING (id);

Undgå især, at flere 1-n-relationer multiplicerer hinanden, når de sættes sammen:

For at hente en enkelt eller få brugere kun LATERAL joins vil være hurtigere (Postgres 9.3+):

SELECT *
FROM   users u
LEFT   JOIN  LATERAL (
   SELECT count(*) AS t1_ct
   FROM   table1
   WHERE  updated_by_id = u.id
   ) ON true
LEFT   JOIN  LATERAL (
   SELECT count(*) AS t2_ct
   FROM   table2
   WHERE  updated_by_id = u.id
   ) ON true
WHERE  u.id = 100;

Forklar opfattet forskel

Den særlige uoverensstemmelse, du rapporterer, skyldes detaljerne i en FULL OUTER JOIN :

Så du får tilføjet NULL-værdier på den respektive anden side for manglende match. count() tæller ikke NULL-værdier. Så du kan få et andet resultat alt efter om du filtrerer på u1.id=100 eller u2.id=100 .

Dette er bare for at forklare, du behøver ikke en FULL JOIN her. Brug i stedet de præsenterede alternativer.




  1. problemer med mysqli prepare

  2. Fejl:skal være ejer af databasen

  3. Importer SQL-fil til mysql

  4. Send en række tags til en plpgsql-funktion og brug den i WHERE-tilstand