webForumDet fria alternativet

MySQL: Två oberoende JOIN

5 svar · 504 visningar · startad av erciz

ercizMedlem sedan maj 20011 826 inlägg
#1

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.

LarsGMedlem sedan dec. 200012 464 inlägg
#2
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
ercizMedlem sedan maj 20011 826 inlägg
#3

LarsG skrev:

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
ercizMedlem sedan maj 20011 826 inlägg
#4

erciz skrev:

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?

Jag glömde givetvis

GROUP BY person.id

Nu funkar det fint, med en JOIN.

SELECT person.*, t1.person AS t1
FROM person
INNER JOIN t1 ON person.id = t1.person
GROUP BY person.id
SELECT person.*, t1.person AS t1 
FROM person, t1 
WHERE person.id = t1.person
GROUP BY person.id
ercizMedlem sedan maj 20011 826 inlägg
#5

Har nu lärt känna mitt problem lite bättre.

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.

ercizMedlem sedan maj 20011 826 inlägg
#6

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
128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)