# Letzten Wert aus einer Gruppe (group by) auslesen



## incubus77 (9. Dezember 2009)

Hallo allerseits,

ich habe ein kleines Problem und verzweifle langsam. Ich habe eine Tabelle die wie folgt aufgebaut ist:

ID  |  Webseite  | Wert 1  | Wert 2 |  usw.

1  |  http://www.xyz.de .. 
2  |  http://www.xyz.de .. 
3  |  http://www.123.de .. 
4  |  http://www.123.de ... 
5  |  http://www.125.de... 

Ich möchte nun immer die gesamte Zeile von einer Webseite auslesen mit, und zwar immer die mit dem höchsten Wert (als Bsp. ID).

Folgenden Ansatz hatte ich:


```
SELECT * , max( ID )
FROM websites
GROUP BY Webseite
```

Leider übenimmet er die Werte nicht korrekt. Wo ist mein Denkfehler?

Bin für jeden Tipp dankbar.

Späte Grüße

incubus


----------



## goto; (9. Dezember 2009)

Hallo, bin zwar keine Leuchte in SQL aber ich glaub soviele möglichkeiten gibt es dabei nicht. Hier mal mein Ansatz.

```
SELECT id
FROM website
ORDER BY id ASC   <!-- Hier Ordnen wir alles Nach ID unzwar absteigende.
LIMIT 0 , 1 <!-- Damit wir auch nur den Ersten Wert erhalten setzen wir noch ein Limit.
```
Denke das könnte funktionieren, ist aber ungetestet. 

PS: Weiß nicht genau wie Kommentare in SQL aussehen müssen. Also nicht hauen^^.

Mfg


----------



## Yaslaw (9. Dezember 2009)

Und wenn man LIMIT nicht mag oder man mit einer DB arbeitet dei LIMIT nicht unterstützt:

```
SELECT *
FROM websites
WHERE id IN (SELECT MAX(id) FROM websites)
```


----------



## incubus77 (9. Dezember 2009)

Vielen Dank für eure Vorschläge, allerdings bekomme ich immer nur eine Zeile zurück und zwar die mit der max(ID). Ich möchte ja mehrere Zeilen zurückbekommen und war immer die mit der max(ID) gruppiert aus "webseite". Also wäre das :

2 | http://www.xyz.de
4 | http://www.123.de
5 | http://www.125.de

Ich hoffe es ist jetzt etwas klarer ;-)

Viele Grüße

incubus


----------



## Vereth (9. Dezember 2009)

Ich hoffe, du kannst in deiner FROM-Klausel ein SELECT verwenden, dann klappt vielleicht folgendes:

```
SELECT * FROM websites
WHERE id IN
( SELECT mId FROM 
  SELECT Webseite, MAX(id) mId
  FROM websites
  GROUP BY Webseite
)
```


----------



## Yaslaw (9. Dezember 2009)

```
SELECT 
	MAX(id) AS mid, 
	website
FROM 
	websites
GROUP BY 
	Webseite
```

Dein Fehler in deinem ersten Vorschlag war das *. Bei einem GROUP BY Query muss jedes Feld entweder im GROUP BY sein oder mit einer GroupByFunction versehen sein (AVG, MAX, COUNT...)

-> http://dev.mysql.com/doc/refman/5.1/de/group-by-functions.html


----------



## Vereth (9. Dezember 2009)

Das Problem ist aber, dass er auch Spalten ausgeben will, für die er keine Aggregatfunktion verwenden kann. Deshalb muss er erst in einer Unterabfrage die gewünschten Id's ermitteln; diese Id-Liste kann dann in der WHERE-Klausel verwendet werden, um die gewünschten Datenzeilen in toto abrufen zu können.


----------



## incubus77 (9. Dezember 2009)

Hallo,

leider funktioniert die vorgeschlagene Lösung von Vereth nicht., aber ich denke dies müsste der richtige Ansatz sein.


```
SELECT * FROM websites
WHERE ID
IN (
  SELECT Webseite, MAX( ID ) AS mId
  FROM websites
  GROUP BY Webseite
)
```

#1241 - Operand should contain 1 column(s) 

Ich benutze MySQL-Client-Version: 5.0.33. Ich hoffe zumindest das 


```
SELECT mId FROM
  SELECT Webseite, MAX(id) mId
```

ein Fehler war?

Viele Grüße

incubus


----------



## Vereth (10. Dezember 2009)

MySQL unterstützt auch Unterabfragen in der FROM-Klausel. Mein Fehler war, dass ich die Klammern und die AS-Klausel vergessen habe. Es muss natürlich heißen:

```
SELECT * FROM websites
WHERE id IN
( SELECT mId FROM 
  ( SELECT Webseite, MAX(id) mId
    FROM websites
    GROUP BY Webseite
  ) AS WebseiteId
)
```

Das Innere SELECT sucht die IDs deiner Weibseiten mittels des GROUP BY heraus, das mittlere filtert die IDs heraus, damit du nur eine Spalte in deiner Liste hast (siehe Fehlermeldung) und das äußere SELECT holt die Daten für die Zeilen mit der ID deiner IN-Liste.


----------

