---
title: "MySQL: Två oberoende JOIN"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/173158-mysql-två-oberoende-join"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "erciz"
published: "2008-08-04T16:56:02.000Z"
updated: "2008-08-04T19:14:19.000Z"
replies: 5
views: 525
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/173158-mysql-två-oberoende-join"
---

# MySQL: Två oberoende JOIN

## #1 — erciz, 2008-08-04T16:56Z

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.

Permalänk: https://www.webforum.nu/p/173158

## #2 — LarsG, 2008-08-04T17:35Z

```
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
```

Permalänk: https://www.webforum.nu/p/2128568

## #3 — erciz, 2008-08-04T17:55Z

> **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
```

Permalänk: https://www.webforum.nu/p/2128573

## #4 — erciz, 2008-08-04T18:04Z

> **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
```

Permalänk: https://www.webforum.nu/p/2128576

## #5 — erciz, 2008-08-04T18:25Z

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. **LarsG**s förslag är dessutom bättre på alla sätt.*

Permalänk: https://www.webforum.nu/p/2128578

## #6 — erciz, 2008-08-04T19:14Z

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 **LarsG**s 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
```

Permalänk: https://www.webforum.nu/p/2128587

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/173158-mysql-två-oberoende-join
