MySQL Distinct nicht auf ganze Zeile

moin,

Ich stehe vor einem Problem wo ich gerade nicht weiterweiss, und zwar geht es um folgendes:
Ich habe ein Programm geschrieben, dass Daten aus einer Datenbank holt und diese wieder hineinschreibt etc. und nun möchte ich gewisse Daten sortieren lassen.
Ich habe z.B die Tabelle sportler, dort sind alle Informationen über die Personen erfasst (ID PK, name, vorname, gebdatum....) und danach habe ich eine Tabelle leichtathletik (ID des sportlers, ergebnisse in den einzelnen Bereichen)

Nun will ich eine Rangliste erstellen, also lese ich die Daten aus beiden Tabellen aus und lasse sie dann nach der Zeit beim 100m Lauf sortieren.
Nun habe ich aber dsa Problem, dass doppelte Einträge dort auftauchen und in der Rangliste sollte jede Person ja nur einmal vorkommen mit dem besten Ergebnis.
Habe es mit Distinct probiert, aber das vergleicht ja die ganze Zeile.
Hat jemand eine Idee wie es geht?

mfg
 
Versuch es mal mit Group by

select * from tabelle1 left join tabelle2 on tabelle1.key = tabelle2.key where 100mzeit<zeitlimit group by laeufername order by zeit

deine versuchten Queries und dein Tabellenaufbau wären hilfreich.

//edit
wiso hab ich da einen left join gemacht?
is auch egal.
geht auch ohne, je nach dem was du genau damit vor hast.
 
Hier der Datenbankaufbau:

table sportler
-ID_sportler PK
-name_sportler
-vorname_sportler
-gebdatum_sportler
-geschlecht_sportler
-bereichLa_sportler
-bereichSchw_sportler (hier werden Werte gesetzt, die anzeigen in welchen Bereichen der Sportler aktiv ist Leichtathletik, Schwimmen, Alpin, Langlauf)


table leichtathletik
-ID_sportler FK
-ID_leichtathletik
-lauf50_leichtathletik
-lauf75_leichtathletik
-lauf100_leichtathletik
.
.
. (alle Teilbereiche)


Ich habe i meinem Programm dann solch einen Befehl gestartet:

Code:
 mysqlcommand = "SELECT DISTINCT sportler.ID_sportler, sportler.name_sportler, sportler.vorname_sportler, sportler.gebdatum_sportler, leichtathletik.lauf50_leichtathletik from sportler, leichtathletik where sportler.ID_sportler = leichtathletik.ID_sportler order by leichtathletik.lauf50_leichtathletik "

Aber jetzt habe ich naürlich die doppelten drinnen und die will ich draussenhaben.


mfg
 
Natürlich hast du alles doppelt.
Du wählst ja auch aus einem Kreuzprodukt aus.

dh jedes element der ersten Tabelle wird mit jedem Element der 2. Tabelle kombiniert und
jedes element der 2.Tabelle wird anschliessend mit einem Element der ersten Tabelle kombiniert.

ersetze mal

...from sportler, leichtathletik
where sportler.ID_sportler = leichtathletik.ID_sportler ...

durch
...from sportler join leichtathletik on Sportler.ID_sportler = lecihtathletik.ID_sportler....
 
Original von sw33tlull4by
Natürlich hast du alles doppelt.
Du wählst ja auch aus einem Kreuzprodukt aus.

dh jedes element der ersten Tabelle wird mit jedem Element der 2. Tabelle kombiniert und

Ne ich hatte nicht alles doppelt sondern ich hatte nur manchmal Einträge öfters drinnen wenn z.B eine Person 2 Ergebnisse im Lauf50 hat und diese 2 Ergebnisse die zwei besten allgemein sind.
Dann taucht diese Person in der Rangliste zweimal auf obwohl sie ja nu reinmal mit dem besten Ergebnis genannt werden soll.
Habe das von dir gerade ausprobiert und da taucht auch die Person dann zweimal auf =(
 
du kannst es mit group by machen.
Du ordnest die Zeiten, der Groesse nach an und machst anschliessend ein group by Sportlername.

Alternativ kannst du auch folgendes machen, keine Garantie, hab gerade keine Datenbank zur Hand um das zu ueberpruefen, geht hier aber auch nur um die Idee

select tmp1. * from (sportler join leichtathletik on sportler.id = leichtathletik.id) as tmp1,(sportler join leichtathletik on sportler.id = leichtathletik.id) as tmp2 where
tmp1.ID = tmp2.ID and tmp1.bestzeit>=tmp2.bestzeit;

Ansonsten hab ich keine Ahnung.
 
Zurück
Oben