Advanced SQL - Praxistutorial 2 - Angebote an mich annehmen Teil 2
1. Die Abschnitte
- Vorwort
- Übersicht
- Angebote von mir anzeigen
- Angebote von mir zurückziehen
- Angebote von mir ändern
- Angebote an mich anzeigen
- Angebote an mich ablehnen
- Angebote an mich annehmen Teil 1
- Angebote an mich annehmen Teil 2
- Ein paar Hinweise
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
- die ID der anbietenden Gilde (im
$_POST['gilde']
) - die ID des Angebots (im
$_POST['id']
) - die ID unserer Gilde (steht i,
$_SESSION
)
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
- den angebotenen Betrag (ist ja nirgendwo übermittelt worden)
- die ID des Mitglieds (die auch nicht)
[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 Tabellenmitglied
und(!)gilde
(wegen desINNER 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.
- Hol mit per Subselect den angebotenen Preis aus dem Angebot mit der per
-
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.
- Hol mit per Subselect die ID des angebotenen Mitglied (
- 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