Vill räkna en persons förekomster i två olika tabeller.
T.ex. Om Person 'Erik' finns i t1 på två rader och i t2 på tre rader så vill jag ha ut:
Erik 2 3
Men jag får ut den kartesiska produkten:
Erik 6 6
JOIN:arna går in i varandra alltså, jag vill ha två OBEROENDE av varandra.
Vill göra något i stil med
SELECT person.*, COUNT(t1.person) AS t1, COUNT(t2.person) AS t2
FROM person
LEFT OUTER JOIN t1 ON person.id = t1.person
LEFT OUTER JOIN t2 ON person.id = t2.person
GROUP BY person.id
Finns det någon snygg lösning på det?
Det går nog lite enklare om jag använder tabell.-notation, men vill helst göra det med JOIN.
SELECT person.namn,
(select COUNT(*)
from t1
where t1.person = person.id) AS t1,
(select count(*)
from t2
where t2.person = person.id) AS t2
FROM person
SELECT person.namn,
(select COUNT(*)
from t1
where t1.person = person.id) AS t1,
(select count(*)
from t2
where t2.person = person.id) AS t2
FROM person
Tackar! Det funkar utmärkt!
Jag skulle iofs vilja ha der som en JOIN, men jag verkar ha tappat förståelsen för det helt och hållet :(
Jag får även kartesiska produkten när jag bara JOINar en tabell, båda dessa satser ger kartesiska produkten, vad gör jag för fel?
SELECT person.*, t1.person AS t1
FROM person
INNER JOIN t1 ON person.id = t1.person
SELECT person.*, t1.person AS t1
FROM person, t1
WHERE person.id = t1.person
SQL-satsen i första inlägget fungerar bra förutom GROUP BY, det är därför COUNT() ger fel resultat, måste gruppera och räkna rätt kolumner. Nu har jag något att klura på ;)
EDIT: Jag ger upp. Jag tänker nog fel. LarsGs förslag är dessutom bättre på alla sätt.
Fick äntligen till den sats som jag först tänkte på:
SELECT person.name, COUNT(DISTINCT t1.id) AS t1, COUNT(DISTINCT t2.id) AS t2
FROM person
LEFT OUTER JOIN t1 ON person.id = t1.person
LEFT OUTER JOIN t2 ON person.id = t2.person
GROUP BY person.id
Men LarsGs sats är bättre.
Och byter man namn på person.id till person.person så kan man göra det lite snyggare:
SELECT name, COUNT(DISTINCT t1.id) AS t1, COUNT(DISTINCT t2.id) AS t2
FROM person
NATURAL LEFT OUTER JOIN t1
NATURAL LEFT OUTER JOIN t2
GROUP BY person
248 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2