MYSQL Abfrage mit spezieller Spalte

cschoeni

Neuer Benutzer
Beiträge
3
Wir haben eine Aufgabe erhalten, bei der eine abfrage gemacht wird (Beispiel habe ich als Datei hochgeladen)
open


SQL File mit allen DB und Tabellen:
table_tennis_aufgabe.sql

Wie im Beispiel ersichtlich, wird der 1. Spieltag korrekt erstellt, aber die weiteren Spieltage nicht.
 
Werbung:
Ich hab die Tabellen mal in PostgreSQL angelegt und die Query angepaßt (ohne extra result-Tabelle, dafür gibt es ja WITH), und das kommt raus:

Code:
test=*# with result as (
  select row_number() over ()
  , "gameDay".play_day as "Spieltag"
  , player.firstname || ' ' || player.lastname as "Spieler"
  , "player_gameDay".total_games
  , team.name as "Mannschaft"
  , trainer.firstname || ' ' || trainer.lastname as "Trainer"
  ,extract(year from now())::int-trainer."YearOfBirth" as "Alter"
  from "player_gameDay" INNER JOIN player ON "player_gameDay".player_id=player.id
  INNER JOIN team ON player.team_id=team.id
  INNER JOIN trainer ON team.trainer_id=trainer.id
  Inner JOIN "gameDay" ON "player_gameDay".gameday_id="gameDay".id
  ORDER BY "Spieltag"
)
  select
  case when (
  select count(*) from result as t1
  where t2."Spieltag" = t1."Spieltag"
  and t1.row_number <= t2.row_number) = 1
  then t2."Spieltag"
  else NULL
  end as "Spieltag"
  , t2.row_number
  , t2."Spieltag"
  , t2."Spieler"
  , t2.total_games
  , t2."Mannschaft"
  , t2."Trainer"
  , t2."Alter"
  from result t2
  order by t2."Spieltag";
 Spieltag | row_number | Spieltag |  Spieler  | total_games | Mannschaft |  Trainer  | Alter
----------+------------+----------+---------------+-------------+------------+--------------+-------
  1 |  1 |  1 | Hans Muster  |  3 | Manschaft1 | Knut Knuston |  48
  |  2 |  1 | Sussi Schnell |  3 | Manschaft2 | Hanna Peter  |  28
  |  3 |  1 | Joana Blatter |  4 | Manschaft2 | Hanna Peter  |  28
  |  4 |  1 | Jasmin Matter |  1 | Manschaft2 | Hanna Peter  |  28
  |  5 |  1 | Sepp Müller  |  2 | Manschaft1 | Knut Knuston |  48
  |  6 |  1 | Hanes Meier  |  3 | Manschaft1 | Knut Knuston |  48
  2 |  7 |  2 | Sepp Müller  |  5 | Manschaft1 | Knut Knuston |  48
  |  8 |  2 | Hanes Meier  |  1 | Manschaft1 | Knut Knuston |  48
  |  9 |  2 | Sabi Süss  |  2 | Manschaft3 | Sven Wittwer |  62
  |  10 |  2 | Hans Muster  |  2 | Manschaft1 | Knut Knuston |  48
  |  11 |  2 | Heiri Müller  |  4 | Manschaft3 | Sven Wittwer |  62
  |  12 |  2 | Josef Gasser  |  2 | Manschaft3 | Sven Wittwer |  62
  3 |  13 |  3 | Heiri Müller  |  2 | Manschaft3 | Sven Wittwer |  62
  |  14 |  3 | Josef Gasser  |  3 | Manschaft3 | Sven Wittwer |  62
  |  15 |  3 | Sussi Schnell |  2 | Manschaft2 | Hanna Peter  |  28
  |  16 |  3 | Joana Blatter |  3 | Manschaft2 | Hanna Peter  |  28
  |  17 |  3 | Jasmin Matter |  3 | Manschaft2 | Hanna Peter  |  28
  |  18 |  3 | Sabi Süss  |  3 | Manschaft3 | Sven Wittwer |  62
(18 Zeilen)

test=*#

Was ist da jetzt falsch?
 
Abgesehen davon das du keine richtige Frage gestellt hast und auch keine Fehlermeldung zeigst würde ich sagen deine gameDay Tabelle hat eine auto_increment id Spalte die du versuchst zu befüllen. Ich glaube ich MySQL geht das sogar, aber vielleicht hast du auch versucht einen Eintrag doppelt zu schreiben.
 
Nope. Nach seinen Befehlen steht da drin:

Code:
test=# select * from "gameDay";
 id | play_day
----+----------
  1 |  1
  2 |  2
  3 |  3
(3 Zeilen)
 
Hallo zusammen
Erstmal herzlichen Dank für eure schnelle Antwort. Ja, das stimmt ich habe keine eindeutige Frage gestellt. Bin mit dieser Aufgabe seit letztem Mittwoch am grübeln. Ich bin überzeugt, dass diese Lösung nicht einmal unser Lehrer kennt. Werde ich auf jeden Fall noch ein Feedback zurückspielen.

@akretschmer Vielen Dank, dass du dir die Zeit genommen hast um das ganze nachzubauen. Ich danke dir auch für die geniale Lösung. Denn bis gestern war ich der Meinung das es keine andere Möglichkeit gibt.

Ich habe nun dein Query in mein vorherigen Code eingebunden, erhalte jedoch ohne DELIMITER $$ eine Fehlermeldung "Syntax error: 'WITH' (with) is not valid input at this position".

Jedoch erhalte ich dadurch kein Ergebnis. Er kann zwar das ganze SQL File ausführen jedoch erhalte ich kein Ergebnis in form einer Tabelle wie in deinem Beispiel.

@ukulele Herzlichen Dank für deinen Input. Ich habe tatsächlich in gameDay ein Auto Increment in Verwendung. Jedoch in der player_gameday (n:m) Tabelle nicht. Da ich nur in dieser schreibe, sollte dies kein Problem darstellen.


Zusammengefasst
- Ich erhalte keine Fehlermeldung ausser ich entferne den DELIMITER

Fragen
- Was muss ich an passen damit das wirklich genial aussehende Query funktioniert?

Code:
DELIMITER $$

WITH result as (
  select row_number() over ()
  , "gameDay".play_day as "Spieltag"
  , player.firstname || ' ' || player.lastname as "Spieler"
  , "player_gameDay".total_games
  , team.name as "Mannschaft"
  , trainer.firstname || ' ' || trainer.lastname as "Trainer"
  ,extract(year from now())::int-trainer."YearOfBirth" as "Alter"
  from "player_gameDay" INNER JOIN player ON "player_gameDay".player_id=player.id
  INNER JOIN team ON player.team_id=team.id
  INNER JOIN trainer ON team.trainer_id=trainer.id
  Inner JOIN "gameDay" ON "player_gameDay".gameday_id="gameDay".id
  ORDER BY "Spieltag"
)


  select
  case when (
  select count(*) from result as t1
  where t2."Spieltag" = t1."Spieltag"
  and t1.row_number <= t2.row_number) = 1
  then t2."Spieltag"
  else NULL
  end as "Spieltag"
  , t2.row_number
  , t2."Spieltag"
  , t2."Spieler"
  , t2.total_games
  , t2."Mannschaft"
  , t2."Trainer"
  , t2."Alter"
  from result t2
  order by t2."Spieltag";
 
DELIMITER ;
 
Werbung:
Zurück
Oben