DISTINCT und MIN kombinieren ???

Hallo,

ich bin nun das erste Mal hier und habe schon ein wenig Grundlagen-Wissen in SQL und PHP. Zumindest hat es dafuer gereicht, fuer unseren Laufklub eine kleine/feine Datenbanktabelle aufzubauen, auf die man nun per Internet zugreifen kann. Wen es interessiert: www.aksljeme.com/?page_id=77, ist allerdings in kroatisch.

Nun weiss ich allerdings nicht weiter:
Ich moechte eine “Alltime-Rangliste” anzeigen, d.h. nur die jeweils persoenlichen Bestzeiten je Veranstaltung und Disziplin.

Nun zu mehr Details;
Die Datenbanktabelle_results_hat u.a. folgende Felder (jedenfalls sind das die wichtigen fuer mein Vorhaben):
·race
·race_year
·race_nr
·race_discipline
·race_info
·name
·surname
·time
Die Ergebnisse aus


[CENTER]distinct (race, race_discipline, race_info, name, surname)[/CENTER]


moechte ich mit den jeweils kleinstentimeverknuepfen.

Beispiel: da laeuft einer 2x in Berlin den Marathon und nur der Datensatz mit seiner Bestzeit soll angezeigt werden. Ein andere laeuft 3x Berlin Marathon und 2x Halbmarathon in Wien (also soll er einmal mit seiner Berliner Bestzeit und einmal mit seiner Wiener Bestzeit angezeigt werden).

Ausgegeben werden soll:
·race
·race_year
·race_nr
·race_discipline
·race_info
·name
·surname
·time

Ich habe im Moment keine Idee, wie ich hier DISTINCT und MIN verknuepfen muss/kann, damit das funktioniert. Vielleicht brauche ich ja auch noch andere Tricks (von denen ich aber noch nicht weiss, dass es sie gibt).

Vielen Dank fuer jeden Hinweis…

Gruss, Bodo

schaue Dir mal DISTINCT ON an, das ist eine PG-Erweiterung.

Andreas

Als Beispiel:

test=*# select * from race;
 id | name  | disziplin | zeit
----+-------+-----------+------
  1 | name  | rennen    |   10
  2 | name2 | rennen    |   12
  3 | name2 | rennen    |   15
  4 | name  | laufen    |   25
  5 | name  | laufen    |   35
(5 rows)

test=*# select distinct on (name, disziplin) name, disziplin, zeit from race order by name, disziplin, zeit asc;
 name  | disziplin | zeit
-------+-----------+------
 name  | laufen    |   25
 name  | rennen    |   10
 name2 | rennen    |   12
(3 rows)

Ist es das, was Du suchst?

Andreas

Aber ja, haargenau…
…danke erstmal fuer Deine prima Aufarbeitung in Tabellenform (werd’ das demnaechst auch so machen).

Nun hab’ ich damit mal etwas rumprobiert und komme mit dem DISTINCT ON nicht klar (weiss nicht wie ich eine PG-Erweiterung bei meinem Hoster installieren soll)

Na egal, hab’ mit deinem prima Ansatz der SQL-Query rumgespielt und bin dann auf folgende Loesung gestoßen, die scheinbar genau das macht, was ich will (muss ich morgen nochmals testen, wenn ich etwas mehr ausgeruht bin):

Statt

select
distinct on (name, disziplin) name, disziplin, zeit
from
race
order by
name, disziplin, zeit asc;

nehme ich nun (dank deiner prima Hilfe)

select
distinct (name, disziplin) name, disziplin, min(zeit)
from
race
group by
name, disziplin
order by
name, disziplin, zeit asc;

Danke vielmals, Andreas.

Ich meld mich nochmal, wenns klappt. Und wenn nicht, dann auch zweckes PG-Erweiterung (falls noetig)

Bodo

Gar nicht. Ist schon drin.

Andreas

Hmmm,

meine SQL-Query klappt nicht…(es gibt doppelte eintraege)

…und das mit dem DISTINCT ON auch irgendwie nicht:
Fehlermeldung:

“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 'on (race_name, runner_surname), race_name, runner_surname, ’ at line 2”

Das klingt irgendwie, als ob das DISTINCT ON sich nicht sehr wohl fuehlt auf der Server-Umgebung.

Hier nochmal das “Andreas”-Query, das ich benutzt habe (ich habe lediglich ein Komma nach dem DISTINCT-ON-Klammer-Begriff eingefuegt

   select
        distinct on (race_name, runner_surname),
        race_name,
        runner_surname,
        runner_race_time
    FROM
        results
    ORDER BY
        race_name,
        runner_surname,
        runner_race_time

Hmmm, nun muss ich irgendwie herausfinden, ob PGSQL tatsaechlich “mit drin ist”, oder? Andere Idee?

Danke

Bodo

Hab grad Feedback von meinem Hoster bekommen, das die PostGreSQL-Erweiterung nicht installiert ist…

Haenge nun also wieder fest… habt ihr noch ne alternative Loesungsidee?

Danke, Bodo

Du hast MySQL. Das schreibt sich anders als PostgreSQL und ist auch was anderes.



Hmmm, nun muss ich irgendwie herausfinden, ob PGSQL tatsaechlich “mit drin ist”, oder? Andere Idee?

Danke

Bodo

Nur wo “PostgreSQL” drauf steht ist auch PostgreSQL drin.

Andreas

Aha, wusste ich nicht. Aus deinem Hinweis PG-Erweiterung (Andreas) habe ich unwissenderweise einfach das gemacht: PostGreSQL ist eine Erweiterung zu MySQL - war wohl nix - und… wieder was gelernt.

D.h. ja auch gleichzeitig, dass ich ein anderes Forum finden muss… :frowning: sicher gibts doch unter Euch auch ein paar MySQL-Experten?

Gruss, Bodo

Wer PostgreSQL hat, wird wohl MySQL eher meiden…

Andreas