King Lully: SQL-Abfragen: Keep it simple

Beitrag lesen

Die Anforderung:

ich hab wahrscheinlich ein sehr triviales Problem.
Ich suche die ID eines Maximums.

Kleines Beispiel
ID|Summe
01|12
02|18
03|12

(Diese Tabelle wird erst durch dir GroupBy-Funktion erstellt!)

Die Lösung soll also ID = 2 sein.

(Das Datenfeld 'ID' bezeichnet also hier überraschenderweise keine Identity, also keine Eindeutigkeit. Demzufolge missfällt uns entweder der Datenfeldname 'ID' und/oder das Datendesign.)
(RDBMS ungenannt, Anforderungslage also möglicherweise dynamischer als erforderlich. => Bei Fragen Konzepte betreffend (hier der Fall) und bei Fragen, die Probleme betreffen, immer möglichst vollständige Angaben machen, werter Fragesteller!)

Lösungsvorschläge:

select top 1
 [id],
 count(*) as 'Summe'
from
 DT_1
group by
 [id]
order by summe desc

(Funktioniert mit T-SQL, also mit MS SQL Server.)

select
 id,
 count(*) as 'Summe'
from
 DT_1
group by
 [id]
order by summe desc
limit
 0, 1

(Funktioniert - soweit http://dev.mysql.com/doc/refman/5.1/de/select.html zu trauen ist - unter MySQL 5.1 (und vermutlich mit allen Versionen))

Wenn die Daten nicht in DT_1 ("Datatable 1") liegen, sondern per Abfrage erst einmal zu ermitteln sind, bspw. aus einer DT_2 mit den Datensätzen:

ID|ranking
1|5
2|3
3|5
1|5
2|8
3|1
1|4

So schlagen wir ein

SELECT TOP 1
 [id],
 Summe
FROM
 (
 select
  [id],
  sum(ranking) as 'Summe'
 from
  DT_2
 group by
  [id]
 ) DT_1
GROUP BY
 [id],
 Summe
ORDER BY
 Summe DESC

vor; funktioniert mit MS SQL Server SQL, für MySQL die SELECT-Syntax wie oben beschrieben anpassen.

Allerdings spricht unseres Erachtens nichts gegen:

SELECT TOP 1
 [id],
 sum(ranking) as 'Summe'
FROM
 DT_2
GROUP BY
 [id]
ORDER BY
 Summe desc

All das alles unter der Annahme, dass versucht wird auf exakt einer Tabelle (Name: 'ranking', in den Beispielen oben als 'DT_1' bzw. 'DT_2' benannt) herumhühnernd Informationen zu gewinnen.