Datenabfragen

Begonnen von munzur, 09 Mai 2004, 11:34:59

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 1 Gast betrachten dieses Thema.

munzur

Datenabfragen
WHERE
Bisher fragen wir immer alle Datensätze ab, aber zum Glück können wir gezielt bestimmte Datensätze abfragen. Dabei ändert sich immer nur der Text (Wert) der Variable $abfrage, alles andere bleibt gleich.

Zu erst lernen wir das Attribut WHERE kennen, damit fragen Datensätze ab, die eine oder mehreren Kriterien entsprechen.

Die Abfrage muss dafür so aussehen:

$abfrage = "SELECT * FROM links WHERE id = '1'";


Wie ihr wisst, muss danach wieder der alte Script folgen, also muss es so aussehen:

$abfrage = "SELECT * FROM links WHERE id = '1'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
   {
   echo "$row->url ";
   }


Aber wie schon oben erwähnt, ändert sich nur der Text (Wert) von $abfrage.

Mit dieser Abfrage wählen wir alle Datensätze aus, die die id 1 haben, und nur der Datensatz wird dann ausgegeben.

Wir können aber auch andere Kriterien setzen, z.B. so:

$abfrage = "SELECT * FROM links WHERE id != '1'";


Hiermit geben wir dann alle Datensätze aus, die als ID nicht den Wert 1 haben.

Oder wir fragen die Datensätze ab, wo die id kleiner als 10 ist

$abfrage = "SELECT * FROM links WHERE id < '10'";


Dies geht natürlich auch mit größer (>) aber auch mit allen anderen Operatoren die ihr von den Schleifen/if-Anweisungen kennt.

Wir können auch andere Spalten überprüfen lassen, z.B. alle Datensätze ausgeben, wo als name Andavos angegeben wurde, dies sieht dann so aus:

$abfrage = "SELECT * FROM links WHERE name
LIKE 'Andavos'";


Anstatt das Gleichheitszeichen wurde jetzt LIKE benutzt. Man könnte zwar ein Gleichheitszeichen benutzen, allerdings sollt ihr ja mal beide Varianten sehen. Man kann auch NOT LIKE benutzen, dies ergibt den selben Effekt wie !=.

Evt. möchte man ja auch mehrere Datensätze abfragen, dafür gibt es das Attribut: IN ()

$abfrage = "SELECT * FROM links WHERE id IN ('1', '3')";


Dies würde die Datensätze 1 und 3 abfragen. Das gleiche geht auch mit Text. Natürlich kann man die Werte auch durch Variablen ersetzen und den Variablen dann Werte zu weisen, z.B. aus einem Formular.

Manchmal möchte man ja nur Datensätze abfragen, wo der Name mit A anfängt. Für unbekannte Zeichen benutzt man in MySQL das: Prozent (%) Zeichen

$abfrage = "SELECT * FROM links WHERE name LIKE 'A%'";


Man kann das Prozent Zeichen immer benutzen, wenn man die genaue Zeichenfolge nicht kennt, also wenn man alle Namen ausgeben möchte, die ein a haben, dann muss die Abfrage so aussehen:

$abfrage = "SELECT * FROM links WHERE name LIKE '%a%'";


Man kann auch mehrere Kriterien setzen, dazu benutzt man AND, OR und XOR. Sie haben die gleiche Funktion wie bei einer if-Anweisung.

$abfrage = "SELECT * FROM links WHERE name LIKE 'Andavos'
AND id < '10'";


Diese Abfrage würde alle Datensätze ausgeben die als name Andavos haben und als id einen kleineren Wert als 10.
ORDER BY
Jetzt möchte man ja evt. die Ausgabe sortieren, z.B. das der neuste Beitrag immer oben steht (dafür kann man auch gut das id-Feld benutzen).
Man kann aber auch andere Felder (z.B. das URL-Feld) sortieren lassen, z.B. Alphabetisch.

Hierfür benötige wir ORDER BY

$abfrage = "SELECT * FROM links ORDER BY id";


Diese Abfrage würde die Einträge der id nach aufsteigend (1,2,3,4) ausgeben, wenn wir aber zum Schluss noch ein DESC schreiben, dann wird die Ausgabe der id nach absteigend (4,3,2,1) ausgegeben.

$abfrage = "SELECT * FROM links ORDER BY id DESC";


Manchmal sieht man auch anstatt ein DESC ein ASC, dies hat die gleiche Wirkung, wie die Abfrage von oben (1,2,3,4), aber dies wird von PHP als Standard eingesetzt, wenn es nicht angegeben wurde.

Wir können jetzt auch die anderen Felder sortiert ausgeben lassen

$abfrage = "SELECT * FROM links ORDER BY name";


Dies würde die Ausgabe nach der Spalte name alphabetisch (a,b,c,d) ausgeben. Die Angabe von DESC würde dies wieder umdrehen (d,c,b,a).

Möchten wir für die Sortierung mehrere Kretieren angeben, dann müssen wir diese durch Komma trennen.

$abfrage = "SELECT * FROM links ORDER BY name, id DESC";


Diese Abfrage sortiert die Ausgabe erst nach dem name (a,b,c,d) und danach nach der id allerdings falsch herrum (4,3,2,1).


LIMIT
Manchmal möchte man ja auch nur eine gewisse Anzahl von Datensätzen ausgeben, dafür gibt es LIMIT.



$abfrage = "SELECT * FROM links LIMIT 3";


Diese Abfrage würde nur 3 Datensätze ausgeben, denn mit LIMIT bestimmen wir, das er nur eine gewisse Anzahl von Datensätzen ausgeben soll.



$abfrage = "SELECT * FROM links LIMIT 10,5";


Hiermit werden 5 Datensätzen ab dem 10. Abgefragt. Somit realisiert man z.B. später eine Blätterfunktion.

Natürlich kann man jetzt auch alle Funktionen verbinden, also so:

$abfrage = "SELECT * FROM links WHERE name LIKE 'Andavos'
AND id < '20' ORDER BY url, id DESC LIMIT 10,5";


Dies würde den Datensätze ausgeben, wo als name Andavos steht und wo die id kleiner ist als 20.
Die Abfrage wird dann bei url alphabetisch sortiert (a,b,c) und dann wird die id absteigend sortiert (3,2,1).
Anschließen werden dann nur 5 Datensätzen vom 10 ausgegeben.

Die Ausgabe könne so aussehen
18 | www.ab.de
11 | www.ab.de
15 | www.ac.de
12 | www.ac.de
19 | www.ad.de

Davor entsprachen die Datensätze 1 bis 9 den Kreterien, wurden aber durch das LIMIT nicht ausgegeben.

Aber Achtung, die Rheinfolge der einzelnen Attribute dürfen nicht willkürlich sein. Zuerst musst dort SELECT * FROM tabelle stehen.
Als nächsten kommt WHERE mit den Kriterien. Danach kommt ORDER BY mit den genaueren Bestimmungen zu Ausgabe. Zum Schluss kommt LIMIT.


Abfrage auf der ganzen Seite benutzen
Manchmal möchte man die Abfrage von einer Tabelle auf der ganzen Seite benutzen (z.B. fürs Design). Zwar könnte man jetzt die Site in die While-Schleife schreiben, das wäre aber ja zu umständlich, und es geht auch einfacher.
Wenn wir nur 1 Wert als Ausgabe haben, dann kann die while-Schleife auch entfallen.

$abfrage = "SELECT * FROM links WHERE id = '1'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

echo "$row->url";



Damit wir nur 1 Wert enthalten, können wir uns die Eigenschaft des id Feldes zu Nutzen machen, denn es gibt nur ein Feld in der Tabelle, die den Wert 1 enthält. Dies haben wir durch den Primary (Primärschlüssel) erreicht.
Aber man kann auch LIMIT benutzen.



$abfrage = "SELECT * FROM links LIMIT 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

echo "$row->url";



Achtung: Sobald mehr als 1 Datensatz gefunden wurde, erhalten wir Fehler bei der Ausgabe.


Hier findet ihr mehr!  http://www.rpgcommunity.de/clanwissen/mysql_anfang.php

[Editiert am 9/5/2004 von munzur]
"Debug-Mode" einschalten.
"SQL-Fehler anzeigen" einschalten
und evt. auftauchende Fehlermeldungen posten .