Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 2 - Angebote an mich annehmen Teil 2

1. Die Abschnitte

2. Der erste SQL-Query

Da wir so viel wie möglich mit so wenig Abfragen wie nötig erledigen wollen, arbeiten wir diesmal mit so genannten Subselects, die euch bis dato immer unterschlagen habe. Aber ein wichtiger Hinweís vorab. Diese Technik sollte man mit Bedacht einsetzen, da man bei falscher Vorgehensweise eines MySQL-Server ganz übel in die Knie gehen lassen kann.

Also, im ersten Schritt soll für das angebotene Mitglied die Gilde geändert werden, und unserer Gilde der entsprechende Goldbetrag angerechnet werden.

Was wir haben

Also sieht der grundsätzliche Aufbau zunächst so aus. Die eckigen Klammern sind erst mal nur Platzhalter für die folgenden Subselects.


for ($i 0$i count($_POST['id']); $i++) {
  $query 'UPDATE 
              mitglied m
            INNER JOIN
              gilde g1 ON m.gilde = g1.id
            SET 
              m.gilde = '.$_POST['gilde'][$i].',
              g1.einnahmen = g1.einnahmen + [SUBSELECT_1]
            WHERE m.id = [SUBSELECT_2]
              AND g1.id = '.$_SESSION['gilde'];
  ...
}

3. Die Subselects

Was wir noch brauchen

[SUBSELECT_1]

Ein Hinweis vorab. Wenn ihr damit arbeitet, so setzt die Subselects immer(!) in Klammern. Und lasst euch von der Farbe der Formatierung nicht irritieren. Ist halt so, wenn man Code mit highlight_string zerschnippelt wie ich gerade.


(
  SELECT
    preis
  FROM
    angebot
  WHERE id '.$_POST['id'][$i].'
)

[SUBSELECT_2]


(
  SELECT
    fuer
  FROM
    angebot
  WHERE id '.$_POST['id'][$i].'
)

Tauscht jetzt die Platzhalter aus dem Basisaufbau mit den konkreten Subselects aus und ihr habt das komplette SQL-Statement. Schaut notfalls einfach in den Lösungscode. Da das Konzept von Subselects für einige auf den ersten Blick nicht zu erfassen ist, muss man sich diesen kompletten Query so vorstellen.

Der prinzipielle Aufbau

  • Mache ein UPDATE auf die Tabellen mitglied und(!) gilde (wegen des INNER JOIN).
  • Setzte die Gilden-ID in der Tabelle mitglied auf den neuen Wert.
  • Erhöhe die Gildeneinahmen um den Wert
    • Hol mit per Subselect den angebotenen Preis aus dem Angebot mit der per $_POST['id'][$i] übermittelten ID.
  • Wo die ID des Mitglieds gleich
    • Hol mit per Subselect die ID des angebotenen Mitglied (fuer) aus dem Angebot mit der per $_POST['id'][$i] übermittelten ID.
  • Und die Gilden-ID gleich meiner ist (zur Sicherheit).

4. Der zweite SQL-Query

Damit reduzieren wir die Einnahmen der Gilde, dessen Angebot wir annehmen. Das Prinzip mit dem Subselect habe ich ja schon gezeigt. Das hier ist dasselbe nur in grün.


$query 'UPDATE 
            gilde g
          SET 
            g.einnahmen = g.einnahmen - (
              SELECT
                preis
              FROM
                angebot
              WHERE id = '.$_POST['id'][$i].'
            )
          WHERE g.id = '.$_POST['gilde'][$i];

5. Der dritte SQL-Query

Der ist dafür zuständig, das entsprechende Angebot zu löschen. Also ein Mäusefurz.


$query 'DELETE FROM angebot WHERE id = '.$_POST['id'][$i];

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt