2017-06-13 2 views
0

Angenommen, nur eine Schule kann in einer bestimmten Stadt identifiziert werden, müssen Sie Schüler von duplizierten Schulen in ursprünglich erstellte Schulen verschieben. Wir nehmen auch an, dass die niedrigste Schul-ID die ersten Schulen beinhaltet, die in der Datenbank erstellt werden, also ursprüngliche Schulen.MySQL Ändern Sie den Spaltenwert auf den kleinsten Wert in seiner Kategorie

Ich möchte dies einfach erreichen, indem ich die Schul-IDs für doppelte Schule + Stadt zur kleinsten Schul-ID (das Original) in dieser Kategorie ändere. Dies sorgt dafür, dass die Tabelle der Schülerakten, die mit dieser verknüpft ist, über einen Fremdschlüssel (Schul-ID) verwaltet wird.

Wie würde ich dies auf dem Tisch tun? Ich denke dabei an SELECT MIN, CASE STATEMENTS sowie GROUP BY und COUNT(), aber ich weiß nicht, wie ich diese kombinieren soll. Jeder hat eine Idee/Code, wie ich die obige Anforderung erreichen würde?

Database Table

+2

Sie noch etwas versucht haben? Bitte geben Sie auch die erwartete Ausgabe an. –

+0

Zusätzlich zu dem obigen Kommentar, die Formulierung im ersten Satz "* Sie sind erforderlich, um *" macht mich denken, dass dies eine Schule/Universität Aufgabe ist, so würden wir erwarten, dass Sie sogar ** mehr ** versuchen, als Sie für würden eine Frage ohne Zuweisung –

+0

Ich würde annehmen, dass die Schul-ID eindeutige Kennung (Schlüssel) ist. Deshalb können Sie es nicht einfach in der Tabelle "Schulen" aktualisieren. Sie müssen die 'school_id' in der Schülerliste aktualisieren, um auf die ID der ursprünglichen Schule zu zeigen. – peterm

Antwort

1

Ich würde annehmen, dass die Schule ID eine eindeutige Kennung (key). Deshalb können Sie es nicht einfach in der Schultabelle aktualisieren. Sie müssen die Spalte school_id in der Tabelle aktualisieren, um auf die id der ursprünglichen Schule zu zeigen.

Wenn dies der Fall ist, dass Sie etwas entlang der Linien von

-- get all students and their current school info for update 
UPDATE students st JOIN schools sc   
    ON st.school_id = sc.id JOIN (
    -- get ids of original schools 
    SELECT town, name, MIN(id) id 
    FROM schools 
    GROUP BY town, name 
) q -- join students with a list original schools ids 
    ON sc.town = q.town AND sc.name = q.name 
    -- change the school id to the original one 
    SET st.school_id = q.id 
    -- but only for students that were associated with non-original schools  
WHERE st.school_id <> q.id 

Hier ist dbfiddle Demo tun können

+0

Das hat perfekt funktioniert! Danke perserm. Ich muss viel über MySQL lernen. Es stellt sich heraus, dass ich gerade an der Oberfläche gekratzt habe. –

Verwandte Themen