Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL: Wieviele Teile gehören zum Ganzen? (https://www.delphipraxis.net/169791-sql-wieviele-teile-gehoeren-zum-ganzen.html)

Angel4585 12. Aug 2012 12:04

Datenbank: MySQL • Version: 5 • Zugriff über: PHP

SQL: Wieviele Teile gehören zum Ganzen?
 
Hallo :)
Ich habe ein kleines Problem in SQL.

Ich habe insgesamt drei Tabellen:
League(level,index,name)
Team(id,townid,name)
LeagueTeam(level,index,townid,teamid)

Jetzt brauche ich eine SQL-Abfrage die mir folgendes Ergebnis ausspuckt:
TeamsInLeague(level,index,town,teamcount)

Also wieviele Teams wurden der Liga zugeordnet.


Habs mitfolgender Anfrage versucht:
Code:
SELECT l.level, l.index, lt.townid, count( * ) teamcount
FROM League l
LEFT JOIN LeagueTeam lt ON lt.level = l.level
AND lt.index = l.index
GROUP BY l.level, l.index
Passt solange mehr als 0 Teams in der Liga sind.
Aber wenn 0 Teams in der Liga sind, bekomme ich für teamcount trotzdem 1.
irgendwie muss ich anders arbeiten mit dem count(*) aber ich komm nicht drauf wie:(
Habt Ihr ne Idee?

PS: Mit Sub-Select wäre es mir prinzipiell klar wie es geht,einfach ein zweites select in das count reinmachen, aber ich möchte es lieber mit join lösen, wenn möglich.

Uwe Raabe 12. Aug 2012 12:10

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Muss das nicht ein INNER JOIN sein?

Angel4585 12. Aug 2012 12:15

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
beim inner join bekomm ich keine Einträge für die Ligen mit 0 Teams, die brauch ich allerdings eher als die Ligen die "voll" sind

DeddyH 12. Aug 2012 12:16

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Ich verstehe die ganze Struktur nicht. Das sieht aus wie eine m:n-Beziehung, aber dazu müsste ein Team ja theoretisch in mehreren Ligen gleichzeitig spielen können. Vielleicht erläuterst Du das Ganze noch einmal kurz etwas ausführlicher.

Angel4585 12. Aug 2012 12:22

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Naja zu einem Zeitpunkt ist ein Team immer nur in einer Liga, aber irgendwann steigt es mal auf oder ab und wechselt die Liga.

DeddyH 12. Aug 2012 12:27

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Das ist mir schon klar, aber dann braucht man noch ein Datumsfeld (oder eine Saison-Kennzeichnung), oder willst Du alle Team-Liga-Zuordnungen, die jemals existiert haben?

Angel4585 12. Aug 2012 12:52

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
hmm.. stimmt eigentlich, ne saison wäre nicht verkehrt.. und die auswertung brauche ich dann natürlich für die aktuellste saison
Saison wäre dann eine Extra-Tabelle deren ID mit bei LeagueTeam dabei wäre.

DeddyH 12. Aug 2012 12:54

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Japp, das müsste stimmen (welches Team in welcher Saison in welcher Liga). Zusätzlich würde ich dann über diese 3 Felder noch einen UNIQUE-Index legen.

[edit] Quatsch, der Index müsste auf der Team-Saison-Kombination liegen, ohne Liga. [/edit]

Angel4585 12. Aug 2012 13:00

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Ja macht sinn da ienen unique index reinzumachen.
Ich probier mal bissl mit der neuen Tabelle rum,ob ich dadurch evtl auf ne gescheite Lösung für die Abfrage komme. :thumb:

sx2008 12. Aug 2012 17:18

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Zitat:

Zitat von Angel4585 (Beitrag 1177908)
Naja zu einem Zeitpunkt ist ein Team immer nur in einer Liga, aber irgendwann steigt es mal auf oder ab und wechselt die Liga.

Dann wäre es wohl sehr sinnvoll den Key der Liga in der Tabelle "Team" zu speichern.
Und die Tabelle "LeagueTeam" wird gelöscht und statt dessen die Tabelle "TeamHistory" erstellt.
Code:
table TeamHistory
=======================================================
IdTeamHistory  | IdTeam | IdLeague | DateFrom | DateTo

DeddyH 12. Aug 2012 17:21

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Was spricht denn gegen eine weitere Tabelle "Saison" wie oben beschrieben?

Angel4585 13. Aug 2012 07:22

AW: SQL: Wieviele Teile gehören zum Ganzen?
 
Also die Tabelle LeagueTeam würde ich vom Namen her schon so lassen, da später noch andere Wettbewerbe wie nationaler und internationaler Pokal dazukommen werden.

Für mich macht eine Tabelle Saison schon Sinn.

Das mit dem Key in der Teamtabelle gefällt mir irgendwie nicht.. es gehört für mich einfach nicht dorthin, sonst hab ich da irgendwann etliche Keys.. wie ne Masterklasse in OOP..

Diese Abfrage macht jetzt aktuell was ich möchte

SQL-Code:
SELECT l . * , ifnull( lt.teamcount, 0 )
FROM League l
LEFT JOIN (
  SELECT lindex, llevel, townid, saisonid, count( * ) teamcount
  FROM LeagueTeam
  WHERE townid = 1 and saisonid = 1
  GROUP BY llevel, lindex, townid
)lt
ON lt.llevel = l.level AND lt.lindex = l.index
Ganz ohne zweites Select ging es dann doch nicht :)
Aber ich bin erstmal zufrieden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz