|
T u t o r i a l
|
|
MySQL Tutorial > Kapitel 4: Weitere Tricks mit SELECT
Antworten zu Fragen aus Kapitel 3:
1. Wie lautet der SQL Befehl zum Sortieren?
"ORDER by feldname".
2. Was verändert ASC bzw. DESC?
Die Reihenfolge der Sortierung.
3. Ist es egal, wohin ich den SQL Befehl zum Sortieren in eine Query schreibe?
Nein jeder Befehl hat seinen bestimmten Platz.
4. Was nützen mir Klammern bei der WHERE Abfrage?
Sie beeinflussen die Reihenfolge in der MySQL die Abfrage ausführt.
5. Was bewirken Aliase?
Sie sind Verweise auf Tabellen.
6. Kann ich ein SQL Query in einem SQL Query ausführen, um zum Beispiel
Informationen für die WHERE Klausel zu sammeln?
Ja.
7. Was nützt mir ein Timestamp?
Ein Timestamp sind die vergangen Sekunden seit der UNIX Epoche. Man kann damit
ganz einfach mit Sekunden rechnen.
Arbeiten mit mehreren Tabellen
MySQL wurde entwickelt, um das Datenbankerlebnis so flexibel zu gestalten
wie es nur geht. Deshalb sollte man nicht alle Daten in eine Tabelle speichern.
Der Umgang mit mehreren Tabellen ist etwas schwieriger als der Bisherige mit nur
einer jedoch auch einfach zu erlernen.
Wir haben in "neuedatenbank_tabelle1" Benutzernamen und Passwörter
gespeichert. Nun soll das ganze auch einen Sinn haben.
Dazu erstellen wir eine weitere Tabelle "neuedatenbank_tabelle2"
in der wir zum Beispiel Bestellungen von Benutzern speichern.
In dieser Tabelle haben wir jetzt eine automatische ZählerID, eine UserID,
eine ArtikelID und einen Timestamp pro Zeile. Wenn einer unserer Benutzer jetzt
etwas bestellt, wird in diese Tabelle seine UserID, die ArtikelID und ein
Timestamp eingetragen.
Eine weitere Tabelle mit
Artikelnamen und Kosten.
Tutorial_Kapitel4_Beispiel_1.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); $q = mysql_query("INSERT into NeueDatenbank_Tabelle3 (name,kosten) VALUES ('Staubsauger','350')", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle3 (name,kosten) VALUES ('Fernseher','200')", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle3 (name,kosten) VALUES ('SAT-Anlage','500')", $connect) OR echo mysql_error(); mysql_close($connect);
?>
|
Angenommen unsere User können einen Staubsauger, einen Fernseher oder eine
SAT-Anlage bestellen. Diese drei Artikel haben wir nun in Beispiel 1 in unsere
dritte Artikeltabelle hinzugefügt.
Zur Demonstration des ganzen Beispiels fügen wir noch die ganzen
Bestellungen der Benutzer in Tabelle zwei hinein.
Tutorial_Kapitel4_Beispiel_2.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); // Maxi $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (1,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (1,2,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (1,2,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (1,1,".time().")", $connect) OR echo mysql_error(); // Fritz $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,2,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,1,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,1,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,1,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (2,1,".time().")", $connect) OR echo mysql_error(); // Susi $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (3,2,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (3,2,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (3,2,".time().")", $connect) OR echo mysql_error(); // Franzl $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,3,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,1,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,1,".time().")", $connect) OR echo mysql_error(); $q = mysql_query("INSERT into NeueDatenbank_Tabelle2 (userid,artikelid,timestmp) VALUES (4,1,".time().")", $connect) OR echo mysql_error(); mysql_close($connect);
?>
|
Maxi
kauft eine SAT-Anlage, zwei Fernseher und einen Staubsauger.
Fritz kauft drei SAT-Anlagen, einen Fernseher und vier Staubsauger.
Susi
kauft keine SAT-Anlage, drei Fernseher und keinen Staubsauger.
Franzl kauft fünf SAT-Anlagen, keinen Fernseher und drei Staubsauger.
Nun ist unsere Einkaufsliste voll und der Händler soll auch sehen können,
wer was bestellt, sonst hat das ganze wenig Sinn.
Wer hat wie viel bestellt?
Tutorial_Kapitel4_Beispiel_3.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); $q = mysql_query("SELECT null from NeueDatenbank_Tabelle2 WHERE userid=3 AND artikelid=2", $connect) OR echo mysql_error(); echo "Susi hat ".mysql_num_rows($q)." Fernseher bestellt."; mysql_close($connect);
?>
|
Dieses Beispiel sagt uns, wie viele Fernseher UserID 3 bestellt hat.
Anstatt mysql_num_rows() können
wir auch direkt im MySQL Query eine Abfrage über die Anzahl der Zeilen machen.
Tutorial_Kapitel4_Beispiel_4.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); $q = mysql_query("SELECT userid,count(userid) from NeueDatenbank_Tabelle2 GROUP by userid", $connect) OR echo mysql_error(); while($data = mysql_fetch_array($q)) { echo "UserID: ".$data[0]." hat ".$data[1]." Artikel bestellt."; } mysql_close($connect);
?>
|
Wenn man diesen Code aufruft bekommen man die Anzahl der bestellten Artikel
von allen Usern mit nur einem SQL Query. Dies geht dank dem "GROUP by"- Befehl.
GROUP by sagt MySQL, es soll alle Zeilen die ein gemeinsames Feld (zum Beispiel
userid) mit den selben Daten drinnen haben in nur einer Zeile zurückgeben. Somit
können wir im SELECT Bereich auch die MySQL Funktion count() einsetzen
GROUP by kommt nach WHERE und vor LIMIT:
Tutorial_Kapitel4_Beispiel_5.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); $q = mysql_query("SELECT userid,count(userid) from NeueDatenbank_Tabelle2 WHERE artikelid=2 GROUP by userid", $connect) OR echo mysql_error(); while($data = mysql_fetch_array($q)) { echo "UserID: ".$data[0]." hat ".$data[1]." Fernseher bestellt."; } mysql_close($connect);
?>
|
Tabellen verknüpfen
Tabellen zu verknüpfen kann sehr nützlich sein, da dies in nur einem
einzigen SQL Query geschieht. Wie Du siehst, wird in den oberen Beispiel 3 und 4
nur die UserID gezeigt und nicht der Name. Niemanden interessiert doch die
UserID... Viel mehr der Name! Deshalb kann man jetzt die UserID von der Tabelle
der bestellten Artikel nehmen und im selben Query den Benutzernamen
herausfinden. Wie das geht?
Tutorial_Kapitel4_Beispiel_6.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); $q = mysql_query("SELECT user.name,count(bestellungen.userid) from NeueDatenbank_Tabelle2 AS bestellungen LEFT JOIN NeueDatenbank_Tabelle1 AS user ON user.id=bestellungen.userid GROUP by bestellungen.userid", $connect) OR echo mysql_error(); while($data = mysql_fetch_array($q)) { echo "Benutzer: ".$data[0]." hat ".$data[1]." Artikel bestellt."; } mysql_close($connect);
?>
|
Wie funktioniert LEFT JOIN?
LEFT JOIN dient sehr gut zur Verbindung von Tabellen. Hierbei muss man nun
Aliase verwenden. Diese definiert man mit "Tabelle AS alias". Nach jeder Tabelle
und Definierung von einem Alias kann man nun einen LEFT JOIN anwenden um
Tabellenelemente miteinander zu verknüpfen. "Tabelle1 AS tb1 LEFT JOIN Tabelle2
AS tb2" Darauf folgt der "ON" Befehl welcher sagt, welche Felder die selben
Daten beinhalten müssen. In unserem Beispiel 5 muss eben die UserID gleich sein.
Wir verbinden also:
ID Name Passwort
|
- - - - -
|
ID UserID ArtikelID Timestmp
"ON tb1.feld1=tb2.feld1".
Wie du in Beispiel 5 siehst, wenden wir dann bei allen übrigen Feldernamen
den Alias an.
Drei Tabellen verbinden
Tutorial_Kapitel4_Beispiel_7.php:
<?php
$connect = mysql_connect("localhost", "Luky", "123456789") OR die("Keine Verbindung"); mysql_select_db("NeueDatenbank", $connect) OR die("Falsche Datenbank"); $q = mysql_query("SELECT user.name,count(bestellungen.userid),sum(artikel.kosten) from NeueDatenbank_Tabelle2 AS bestellungen LEFT JOIN NeueDatenbank_Tabelle1 AS user ON user.id=bestellungen.userid LEFT JOIN NeueDatenbank_Tabelle3 AS artikel ON bestellungen.artikelid=artikel.id GROUP by bestellungen.userid", $connect) OR echo mysql_error(); while($data = mysql_fetch_array($q)) { echo "Benutzer: ".$data[0]." hat ".$data[1]." Artikel im Wert von ".$data[2]." bestellt."; } mysql_close($connect);
?>
|
Alle Beispiele von Kapitel 4
|
|
|