# Hilfe: Werte sind alle x2 (oder mehr) nach JOIN



## Gast (6. Nov 2007)

Hallo,

in meiner GUI sind mir eben sehr merkwürdige Werte aufgefallen ... 
Nach kurzem Suchen stellte sich herraus, das das SQL Query wohl irgendwo nicht ganz richtig ist :-/
Ich hoffe das mir jemand von euch helfen kann, denn ich verstehe die welt nicht mehr 

In meiner Tabelle sind für jeden einzelnen Tag (als Timestamp) Werte zu Objekten gespeichert.
Diese Objekte sind in Gruppen zusammengefasst die dann die Gesamt Werte anzeigen sollen.

Mache ich nun folgende Abfrage:

```
SELECT gruppe.name, SUM(objekt.klicks) 
FROM gruppe 
LEFT JOIN objekt ON gruppe.gruppen_id = objekt.gruppen_id 
WHERE objekt.day BETWEEN 1193871600 AND 1193957999 
GROUP BY objekt.gruppen_id
```

Bekomme ich 3 Datensätze zurück (ist, korrekt - ich habe 3 Gruppen). Allerdings sind die Werte der auf summierten Clicks falsch, nämlich in diesem Fall x2.

Setze ich un folgendes Statement ab:

```
SELECT SUM(objekt.clicks) 
FROM objekt 
WHERE objekt.day BETWEEN 1193871600 AND 1193957999 
GROUP BY objekt.gruppen_id
```

Bekomme ich wieder 3 datensätze, diesmal allerdings mit den richtigen Werten ...

Kann mir vllt. jemand erklären/helfen/sagen warum dieses Problem auftaucht und wie man es umgeht?!

Vielen lieben Dank schonmal im Vorraus!


----------



## SlaterB (6. Nov 2007)

wie siehst mit einfachen Aufsummierungen ohne Group By aus?

SELECT SUM(objekt.clicks) 
FROM objekt 
 vs

SELECT SUM(objekt.klicks) 
FROM gruppe 
LEFT JOIN objekt ON gruppe.gruppen_id = objekt.gruppen_id 


---------

und generell:
verkürze die Tabellen auf jeweils wenige Gruppen/ wenige Elemente
und lasse dir die gejointe Tabelle ohne Select oder Group By komplett ausgeben,
wieviele Spalten, wieviele Clicks?


----------



## The_S (6. Nov 2007)

Wie ist denn deine Tabellen aufgebaut? Und du bist dir sicher, dass das hier


```
SELECT gruppe.name, SUM(objekt.klicks)
FROM gruppe
LEFT JOIN objekt ON gruppe.gruppen_id = objekt.gruppen_id
WHERE objekt.day BETWEEN 1193871600 AND 1193957999
GROUP BY objekt.gruppen_id
```

geht? Ich hätte ma gesagt, dass muss korrekt so heißen


```
SELECT gruppe.name, SUM(objekt.klicks)
FROM gruppe
LEFT JOIN objekt ON gruppe.gruppen_id = objekt.gruppen_id AND objekt.day BETWEEN 1193871600 AND 1193957999
GROUP BY gruppe.name
```

Voraussetzung natürlich, dass gruppen_id eindeutig ist.


----------



## Guest (6. Nov 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> geht? Ich hätte ma gesagt, dass muss korrekt so heißen
> 
> 
> ```
> ...



gruppen_id ist überall eindeutig. Der Code geht sowohl mit dem WHERE als auch mit dem AND dahinter.
Machte de fakto gerade keinen Unterschied sprich -> auch hier waren die Werte doppelt.

@SlaterB
Die SUM Funktion klappt nicht ohne GROUP BY - lasse ich das JOIN weg und mache dann in der tabelle ein GROUP BY über die GRUPPEN_ID, bekomme ich die richtigen Werte, wie ich ja oben schon geschrieben hatte ...


----------



## The_S (6. Nov 2007)

Mein Augenmerk lag auch nicht wirklich auf der Where-Klausel, sondern vielmehr darin, dass du gruppen.name selektierst, aber nach objekt.gruppen_id gruppierst. Sollte imho eine SQL-Exception geben ...


----------



## Guest (6. Nov 2007)

ahhso, das hatte ich eben glatt übersehen in deinem code ... :-/
läuft allerdings problemlos ohne irgendwelche exceptions bei mir.


----------



## The_S (6. Nov 2007)

Ich nehme an, in der Tabelle objekt, kann eine gruppen_id zweimal vorkommen!?


----------



## Guest (6. Nov 2007)

ja, das ist möglich


----------



## The_S (6. Nov 2007)

Versuch das mal


```
WITH objSq as (
	SELECT gruppen_id, SUM(klicks) klicks
	FROM objekt
	WHERE day BETWEEN 1193871600 AND 1193957999
	GROUP BY gruppen_id
)
SELECT gruppe.name, objSq.klicks 
FROM gruppe
LEFT JOIN objSq ON gruppe.gruppen_id = objSq.gruppen_id
```


----------



## Guest (6. Nov 2007)

hmm da bekomm ich sofort den Fehler:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WITH objSq as ( ...


----------



## The_S (6. Nov 2007)

OK, dann hat MySQL da scheinbar eine andere Syntax. Mal gucken ob ich ein Äquivalent dazu für MySQL finde.


----------



## The_S (6. Nov 2007)

Also scheinbar gibts sowas in MySQL nicht. Müsstest dir ne Temporäre Tabelle anlegen, in der du bereits die betreffenden gruppen_ids der Tabelle Objekt gruppierst und die klicks aufsummierst. Und diese Temporäre Tabelle joints du dann deiner gruppen-tabelle.

Könnte auch sein, dass es noch was einfacheres in MySQL gibt, aber ich hab jetzt auf die Schnelle nichts gefunden und bin so auch net wirklich n MySQL-Fan  .


----------



## Guest (6. Nov 2007)

hmm ok, danke ;-)
allerdings frage ich mich wieso er die werte da x2 genommen ausgibt :-/


----------



## The_S (6. Nov 2007)

Naja, weil du die Tabelle objekt jointst. Diese Tabelle kann aber eine gruppen_id zweimal haben. Dadurch bekommst du mehrere Datensätze. Und das Group By bezieht sich nicht schon auf den Join selbst, sondern auf die bereits gejointen tabellen.


----------

