2016-11-30 4 views
0

Ich habe eine SQL-Datenbank wie Major League Baseball strukturiert. Es hat eine American League und eine National League, die Divisionen enthalten, die Teams enthalten, die Gewinn/Verlust-Datensätze haben und Spieler enthalten.SQL: eine Krawatte zu brechen

Meine Ligatabelle hat: | league_name | league_id (Primärschlüssel) | Wildcard |

Wo Wildcard ist ein Fremdschlüssel TeamID, die die beste Mannschaft in einer Division ist, die diese Division nicht führt.

Hier ist meine Trigger Wild Card zu aktualisieren, wenn ich meine Z_TEAMS Tabelle aktualisieren (wo die Gewinn/Verlust-Aufzeichnungen gehalten werden):

UPDATE Z_LEAGUES 
SET `Z_LEAGUES`.`Wild Card` = (SELECT teamID 
          FROM Z_TEAMS 
          WHERE (teamWins/teamLoss) = 
          (SELECT MAX(teamWins/teamLoss) FROM Z_TEAMS, 
          Z_DIVISIONS WHERE Z_TEAMS.divID = 
          Z_DIVISIONS.divID AND Z_DIVISIONS.leagueID = 
          Z_LEAGUES.leagueID AND Z_TEAMS.teamID != Z_DIVISIONS.divLeader)) 

Es funktioniert in der Regel gut und nimmt das richtige Team Z_TEAMS jedes Mal aktualisiert wird, . Wenn ich jedoch versuche, Z_TEAMS zu aktualisieren, sodass zwei Teams denselben Datensatz haben und beide Kandidaten für Joker sind, gibt der Trigger mehr als eine Zeile zurück und beschränkt die Aktualisierung.

Meine Frage ist: Wie kann ich diese Krawatte brechen? Ich bin offen für die Anzeige beider Teams in der Wild Card, oder willkürliche Auswahl oder alphabetische Reihenfolge. Ich bin ziemlich neu in SQL und kann das nicht herausfinden.

+0

Dies ist nicht so sehr eine MySQL-Frage, sondern vielmehr, welche Art von Algorithmus Sie entwickeln sollten. Sie können jeden Tieferbrecher entwickeln, den Sie oder Ihre Benutzer für angemessen halten. Du kannst dir die beiden Teams anschauen und herausfinden, welche die beste Bilanz hat. Und wenn dies zu einem Gleichstand führt, läuft das Team mit den meisten Läufen für die Saison, und so weiter und weiter. Sehen Sie sich die Verfassung der Vereinigten Staaten an und sehen Sie, wie die Beziehungen im Wahlkollegium gehandhabt werden. Sie brauchen eine Art Tie Breaker Algorithmus und was das ist, liegt an Ihnen. – mba12

Antwort

0
UPDATE Z_LEAGUES 
SET `Z_LEAGUES`.`Wild Card` = 
(SELECT teamID 
FROM Z_TEAMS 
WHERE (teamWins/teamLoss) = 
    (SELECT MAX(teamWins/teamLoss) 
    FROM Z_TEAMS, Z_DIVISIONS 
    WHERE Z_TEAMS.divID = Z_DIVISIONS.divID 
     AND Z_DIVISIONS.leagueID = Z_LEAGUES.leagueID 
     AND Z_TEAMS.teamID != Z_DIVISIONS.divLeader) 
ORDER BY teamID 
Limit 1) 

Die letzten 2 Zeilen zu Ihrer Basisabfrage hinzugefügt.

Limit wird die Ausgabezeilen begrenzen, und Reihenfolge nach Reihenfolge für Precitability, welche Zeile ausgewählt wird.

Sie können order by teamID desc verwenden, um die Sortierung umzukehren.

+0

genial, danke! –

+0

akzeptieren Sie die Lösung als Antwort, wenn es funktioniert – rshetye

Verwandte Themen