Probleme bei einer Abfrage

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

Probleme bei einer Abfrage

Postby Oldani » 20. December 2008 23:11

Hallo zusammen,

ich verzweifle an einer Abfrage... ich habe ein Datenbank für die Wettkampfresultate in unserem Laufsport-Verein erstellt. Sie sieht etwa so aus:

Code: Select all
CREATE TABLE Mitglied
(
  ID INT NOT NULL AUTO_INCREMENT,
  Name VARCHAR(255) NOT NULL,
  Vorname VARCHAR(255) NOT NULL,
  ...
  CONSTRAINT Mitglied_PK PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE Strecke
(
  ID INT NOT NULL AUTO_INCREMENT,
  VeranstaltungID INT NOT NULL,
  StreckentypID int,
  Belag TEXT,
  Distanz DOUBLE,
  Profil VARCHAR(255),
  Hoehenmeter VARCHAR(255),
  Anmerkungen TEXT,
  CONSTRAINT Strecke_PK PRIMARY KEY (ID),
  CONSTRAINT Strecke_Veranstaltung_FK FOREIGN KEY (VeranstaltungID) REFERENCES Veranstaltung(ID) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT Strecke_Streckentyp_FK FOREIGN KEY (StreckentypID) REFERENCES Streckentyp(ID) ON UPDATE CASCADE
)ENGINE=InnoDB;

CREATE TABLE Kategorie
(
  ID INT NOT NULL AUTO_INCREMENT,
  AnlassID INT NOT NULL,
  StreckeID INT NOT NULL,
  KategorieBez VARCHAR(255),
  Herrenkat BOOLEAN,
  CONSTRAINT Kategorie_PK PRIMARY KEY (ID),
  CONSTRAINT Kategorie_Anlass_FK FOREIGN KEY (AnlassID) REFERENCES Anlass(ID) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT Kategorie_Strecke_FK FOREIGN KEY (StreckeID) REFERENCES Strecke(ID) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB;

CREATE TABLE Resultat
(
  ID INT NOT NULL AUTO_INCREMENT,
  Tage INT,
  Zeit TIME,
  KategorieID INT NOT NULL,
  MitgliedID INT NOT NULL,
  Rang INT,
  RangKat INT,
  Bemerkung TEXT,
  LinkText VARCHAR(255),
  LinkUrl TEXT,
  Geprueft BOOLEAN,
  CONSTRAINT Resultat_PK PRIMARY KEY (ID),
  CONSTRAINT Resultat_Kategorie_FK FOREIGN KEY (KategorieID) REFERENCES Kategorie(ID) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT Resultat_Mitglied_FK FOREIGN KEY (MitgliedID) REFERENCES Mitglied(ID) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB;


Strecke.StreckentypID gibt an von welchem Typ die Strecke ist. '5' steht z.B. für Marathon, '2' für einen 10km-Wettkampf.

Ich möchte nun die Vereinsbestzeit auf der Marathon-Distanz abfragen. Ich habe es so versucht:

Code: Select all
SELECT Resultat.Zeit, Resultat.ID, Resultat.MitgliedID
FROM (
Strecke
INNER JOIN Kategorie ON Strecke.ID = Kategorie.StreckeID
)
INNER JOIN Resultat ON Kategorie.ID = Resultat.KategorieID
WHERE (
(
(Strecke.StreckentypID) =5
)
AND ((Kategorie.Herrenkat) = True)
)
ORDER BY `Resultat`.`Zeit` ASC


Das gibt mir die folgende Ausgabe:

Resultat.Zeit Resultat.ID Resultat.MitgliedID
02:37:59 1775 292
02:38:18 1194 78
02:39:04 476 78
02:39:58 1789 78
02:39:58 833 78
02:40:11 99 78
02:40:22 1084 78
02:40:38 477 160
02:41:08 646 78
02:43:05 1507 78

Natürlich möchte ich jedes Mitglied nur einmal in der Liste drin haben, nähmlich diejenige Zeile mit der besten Zeit. In diesem Beispiel wäre der einzig interessante Eintrag für Mitglied mit ID '78': Zeit: 02:38:18, ResId: 1194.

Wie kriege ich diese Abrage hin?

Vielen Dank für's Helfen!
Oldani
 
Posts: 2
Joined: 20. December 2008 22:34

Re: Probleme bei einer Abfrage

Postby Oldani » 21. December 2008 19:24

OK ich habe es doch noch rausbekommen und möchte diejenigen welche es interessiert teilhaben lassen. Das Problem liegt daran, dass in der SELECT Klausel neben der Gruppenfunktion MIN() 2 „Single Row Expressions“ stehen, in der GRPUP BY Klausel wird aber nur eine davon verwendet. SQL sollte in diesem Fall eine exception werfen (Oracle z.B. tut das auch), MySql lässt diese Abfrage zu, gibt aber Mist zurück. Das Statement sollte heissen:

Code: Select all
SELECT Min( Resultat.Zeit ) , Resultat.MitgliedID
FROM
(Strecke INNER JOIN Kategorie ON Strecke.ID = Kategorie.StreckeID)
         INNER JOIN Resultat ON Kategorie.ID = Resultat.KategorieID
WHERE
(
   ((Strecke.StreckentypID) =5) AND ((Kategorie.Herrenkat) = True)
)
GROUP BY Resultat.MitgliedID
ORDER BY Min( `Resultat`.`Zeit` ) ASC

D.h. Ich muss auf die Resultat.ID in der Select Klausel verzichten.

Ebenfalls korrekt wäre:
Code: Select all
SELECT Min( Resultat.Zeit ) , Resultat.ID, Resultat.MitgliedID
FROM
(Strecke INNER JOIN Kategorie ON Strecke.ID = Kategorie.StreckeID)
         INNER JOIN Resultat ON Kategorie.ID = Resultat.KategorieID
WHERE
(
   ((Strecke.StreckentypID) =5) AND ((Kategorie.Herrenkat) = True)
)
GROUP BY Resultat.MitgliedID, Resultat.ID
ORDER BY Min( `Resultat`.`Zeit` ) ASC

Das Resultat würde aber nicht das gewünschte sein.
Oldani
 
Posts: 2
Joined: 20. December 2008 22:34


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 10 guests