Php & Mysql, Zeilen Schrittweise ausgeben
Phil
- php
0 Mav0 Rolf0 Mav0 Phil0 Vinzenz Mai
1 Vinzenz Mai- datenbank
Hallo Zusammen,
Ich habe ein Problem. Ich habe eiine Mysql Datenbank. Sie ist wie folgt angelegt,
num, image, name
Das sieht das zum Beispiel so aus,
1 | aaa.jpg | John
2 | bbb.jpg | Doe
3 | ccc.jpg | Jane
4 | ddd.jpg | Doe
Nun würde ich gerne mit PHP die Zeilen Schrittweise oder einzeln ausgeben. Sol heissen, ich würde gerne mit PHP Zeile 1, 3, 6 und 10 ausgeben. Wie mache ich das?
Vielen Dank, ein schönen Sonntag auch, Gruss Phil
Hallo
Nun würde ich gerne mit PHP die Zeilen Schrittweise oder einzeln ausgeben. Sol heissen, ich würde gerne mit PHP Zeile 1, 3, 6 und 10 ausgeben. Wie mache ich das?
Indem du zum Beispiel die Abfrage auf die entsprechenden Zeilen begrenzt:
SELECT
*
FROM
tabelle
WHERE
num IN (1, 3, 6, 10)
LIMIT 4
Hallo Mav,
SELECT
*
FROM
tabelle
WHERE
num IN (1, 3, 6, 10)
LIMIT 4
was soll eigentlich das LIMIT 4 bewirken?
Lass es einfach weg ...
mbG Rolf
Hallo,
was soll eigentlich das LIMIT 4 bewirken?
Lass es einfach weg ...
Es werden exakt 4 Datensätze erwartet. Warum dann nicht also auch die Abfrage auf maximal 4 Zeilen beschränken? Macht sicher bei einer Tabelle mit 10 Zeilen noch keinen Sinn, aber wenn es 10.000 Datensätze sind dürftest du den Geschwindigkeitsunterschied merken, da MySQL nämlich nach den 4 gefundenen Datensätzen sofort aufhört zu suchen und nicht noch versucht weitere passende Datensätze zu finden.
Vielen Dank für Eure Hilfe.
Klingt einleuchtend! Eine kleine Frage habe ich noch, welche ich nicht aus den Antworten herauslesen konnte,
Wenn ich nun die Datensätze nach den Namen sortiere, (order by name) kann ich dann die Datensätze Schrittweise ausgeben, zum Beispiel das jede dritte Zeile angezeigt wird?
Danke und ein schöner Sonntag! Gruss Phil
Hallo Phil,
Wenn ich nun die Datensätze nach den Namen sortiere, (order by name) kann ich dann die Datensätze Schrittweise ausgeben, zum Beispiel das jede dritte Zeile angezeigt wird?
verstehe ich Dich richtig: Du bist nur an jedem dritten Datensatz interessiert, d.h. bei den vier Datensätzen Deines Beispiels möchtest Du _nach_ der Sortierung nur den dritten Eintrag haben? Ja, das geht auch.
Es sollte Dir einleuchten, dass es besser ist, nur die Daten vom DBMS anzufordern, die man verarbeiten will. Deswegen solltest Du nun Deine Abfrage umschreiben. Die Abfrage wird schon deutlich komplizierter. Du benötigst eine Benutzervariable und eine Unterabfrage (setzt übrigens MySQL 4.1.x oder höher voraus).
Deine Beispieldaten
1 | aaa.jpg | John
2 | bbb.jpg | Doe
3 | ccc.jpg | Jane
4 | ddd.jpg | Doe
1. Schritt: Wir zählen mit:
SET @a=0; -- Initialisieren einer Benutzervariablen
SELECT
@a:=(@a+1) position, -- Erhöhe den Wert bei jedem Datensatz um 1
num, -- die interessierenden Spalten
image,
name
FROM
tabelle -- Deiner Tabelle
ORDER BY -- sortiert nach der Spalte
name -- name
liefert bei Deinen Beispieldaten folgendes (mögliche) Ergebnis
position | num | image | name
--------------------------------
1 | 4 | ddd.jpg | Doe
2 | 2 | bbb.jpg | Doe
3 | 3 | ccc.jpg | Jane
4 | 1 | aaa.jpg | John
Beachte bitte, dass die Reihenfolge der ersten beiden Datensätze in der Ergebnismenge zufällig ist. Sie könnte somit auch umgekehrt sein.
Nun willst Du nur den dritten Datensatz haben:
SET @a=0; -- Initialisieren einer Benutzervariablen
SELECT
a.position,
a.num,
a.image,
a.name
FROM ( -- Du kannst statt Spalten einer Tabelle auch
SELECT -- die Spalten einer Abfrage abfragen
-- Das nennt man Unterabfrage
@a:=(@a+1) position, -- Erhöhe den Wert bei jedem Datensatz um 1
-- Gib der Spalte einen sprechenden Namen
num, -- die interessierenden Spalten
image,
name
FROM
tabelle -- Deiner Tabelle
ORDER BY -- sortiert nach der Spalte
name -- name
) a -- Gib der Unterabfrage einen Namen, damit
-- Du auf ihre Spalten zugreifen kannst
WHERE
[link:http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_mod@title=MOD(position, rang) = 0
-- nur die Zeilen, deren Position ein
-- Vielfaches von 3 ist, d.h. jeden dritten
-- Datensatz
liefert die gewünschte Ergebnismenge (zumindest so, wie ich Dich verstanden habe):
position | num | image | name
--------------------------------
3 | 3 | ccc.jpg | Jane
Beachte bitte, das das SET-Statement und das SELECT-Statement in der gleichen Verbindung abgesetzt werden müssen. Ein typischer Fall für mysqli.
Freundliche Grüße
Vinzenz
Hallo
was soll eigentlich das LIMIT 4 bewirken?
Lass es einfach weg ...
Ja. LIMIT ist überflüssig und schädlich. Es bringt keinen Nutzen, dafür aber unnötige Verständnisschwierigkeiten und schränkt die Portabilität ein. Es gibt ganz genau keinen Grund, hier LIMIT zu verwenden.
Es werden exakt 4 Datensätze erwartet. Warum dann nicht also auch die Abfrage auf maximal 4 Zeilen beschränken?
Nein.
Macht sicher bei einer Tabelle mit 10 Zeilen noch keinen Sinn, aber wenn es 10.000 Datensätze sind dürftest du den Geschwindigkeitsunterschied merken,
Nein. Kein Geschwindigkeitsunterschied. Vielleicht sogar ein Verlust.
Selbstverständlich wird ein Index auf der Spalte num vorausgesetzt.
Freundliche Grüße
Vinzenz
Hallo Phil,
Ich habe ein Problem. Ich habe eiine Mysql Datenbank. Sie ist wie folgt angelegt,
als Begriffsklärung: Das sind die Spalten einer Tabelle in einer Datenbank, die von dem Datenbankmanagementsystem (DBMS) MySQL verwaltet wird.
num, image, name
Das sieht das zum Beispiel so aus,
1 | aaa.jpg | John
2 | bbb.jpg | Doe
3 | ccc.jpg | Jane
4 | ddd.jpg | DoeNun würde ich gerne mit PHP die Zeilen Schrittweise oder einzeln ausgeben. Sol heissen, ich würde gerne mit PHP Zeile 1, 3, 6 und 10 ausgeben. Wie mache ich das?
Es gibt keine Zeilen 1, 3, 6, 10. Jedenfalls nicht in dem Sinne, den Du vielleicht meinst. In welcher Reihenfolge das DBMS die Zeilen einer Tabelle speichert ist völlig unwichtig. Wenn Du eine bestimmte Reihenfolge haben möchtest, dann musst Du nach einem Kriterium sortieren.
Möchtest Du Datensätze, die einen bestimmten Wert in einer Spalte, z.B. der Spalte "num" haben, dann gibst Du diese Kriterien in der WHERE-Klausel Deiner SELECT-Anweisung an. Möchtest Du z.B. die Datensätze, die in "num" die Werte 1, 3, 6 und 10 haben und aufateigend nach den Werten in "num" sortiert, so lautete Deine SQL-Anweisung:
SELECT -- Gib mir die Werte der Spalten
num, -- num,
image, -- image und
name -- name
FROM tabelle -- aus meiner Tabelle
WHERE -- wobei mich nur die Datensätze interessieren,
num IN (1, 3, 6, 10) -- bei denen num die Werte 1, 3, 6 oder 10 annimmt
ORDER BY -- Sortiere die Ergebnismenge nach den Werten
num -- der Spalte num
Wie Du mit PHP diese Abfrage an das DBMS übermitteln, anschließend die von MySQL zurückgelieferten Daten entgegennehmen und weiterverarbeiten kannst, das steht in den entsprechenden Handbuchabschnitten von PHP. Ich empfehle Dir, entweder die verbesserte MySQL-Erweiterung (ignoriere die Warnung, die deutsche Doku ist hier schrecklich veraltet) oder gleich PDO zu verwenden.
Freundliche Grüße
Vinzenz