Jeden zweiten Datensatz aus der Datenbank lesen
Hi,
ich hab da mal eine kleine Frage,
immoment suche ich jeden Datensatz aus einer Tabelle heraus, benutze danach allerdings nur jeden zweiten.
Meine momentane Lösung ist eine PHP Variable names $zaehler, die ich in der while schleife immer so hinpole, wie ich es gerade brauche, damit nur jeder zweite datensatz angezeigt wird.
Hintergrund ist eine Art Kalender für mehrere Geräte (Vermietungssoftware). Nun habe ich der Datenbank für jedes Gerät für jeden Tag 13 Einträge (Von 8-18 Uhr), in denen ich ein Status vergeben habe (0 --> frei, 1 --> entliehen, 2 --> defekt). Die Zeitangabe wird als PHP Timestamp gespeichert.
Wenn man sich nun aber eine Übersicht von z.B 40 Geräte ansieht, dann dauert es extrem lange, bis die Seite aufgebaut wird. Beispiel:
$sql="
SELECT
entliehen.status,
entliehen.zeitpunkt
FROM
entliehen
WHERE
entliehen.geraet='".$row0['id']."'
AND
entliehen.zeitpunkt>='$time_start_monat'
AND
entliehen.zeitpunkt<='".get_ende_monat($time_start_monat)."'
ORDER BY
entliehen.zeitpunkt;";
$result = mysql_query($sql) OR die(mysql_error());
$uhrzeit_zaehler = 0;
$anzeige_zaehler = 1;
while($row = mysql_fetch_array($result))
{
$uhrzeit_zaehler++;
if(date("G",$row['zeitpunkt']) == 8)
{
echo "<td>";
}
if($anzeige_zaehler == 1)
{
if($row['status'] == 0) echo "<a id='...' href='...'> </a>";
elseif($row['status'] == 2) echo "<a id='...' href='...'> </a>";
else echo "<a id='...' href='...'> </a>";
}
if(date("G",$row['zeitpunkt']) == 18)
{
echo "</td>\n";
$uhrzeit_zaehler = 0;
}
if($anzeige_zaehler == 1 AND
date("G",$row['zeitpunkt']) != 18)
$anzeige_zaehler = 0;
else $anzeige_zaehler = 1;
}
Dass ich nur jeden 2. Datensatz anzeige, hat damit zu tun, dass wenn man das so macht, wie ich das realisiert habe, die Tabelle sehr breit wird. Daher soll nur jeder 2. Datensatz angezeit werden (8 Uhr, 10 Uhr usw.)
Jetzt wollte ich fragen, ob es eine Möglichkeit gibt, bereits in SQL zu sagen, dass man nur jeden zweiten Datensatz haben möchte, damit man nicht die Menge an daten hat und dann der Seitenaufbau schneller von statten geht.
Vielleicht habt ihr ja auch noch sonst andere Ideen, um den Seitenaufbau schneller zu machen.
Vielen dank im Vorraus,
mfg, brc
ich hab da mal eine kleine Frage,
immoment suche ich jeden Datensatz aus einer Tabelle heraus, benutze danach allerdings nur jeden zweiten.
Meine momentane Lösung ist eine PHP Variable names $zaehler, die ich in der while schleife immer so hinpole, wie ich es gerade brauche, damit nur jeder zweite datensatz angezeigt wird.
Hintergrund ist eine Art Kalender für mehrere Geräte (Vermietungssoftware). Nun habe ich der Datenbank für jedes Gerät für jeden Tag 13 Einträge (Von 8-18 Uhr), in denen ich ein Status vergeben habe (0 --> frei, 1 --> entliehen, 2 --> defekt). Die Zeitangabe wird als PHP Timestamp gespeichert.
Wenn man sich nun aber eine Übersicht von z.B 40 Geräte ansieht, dann dauert es extrem lange, bis die Seite aufgebaut wird. Beispiel:
$sql="
SELECT
entliehen.status,
entliehen.zeitpunkt
FROM
entliehen
WHERE
entliehen.geraet='".$row0['id']."'
AND
entliehen.zeitpunkt>='$time_start_monat'
AND
entliehen.zeitpunkt<='".get_ende_monat($time_start_monat)."'
ORDER BY
entliehen.zeitpunkt;";
$result = mysql_query($sql) OR die(mysql_error());
$uhrzeit_zaehler = 0;
$anzeige_zaehler = 1;
while($row = mysql_fetch_array($result))
{
$uhrzeit_zaehler++;
if(date("G",$row['zeitpunkt']) == 8)
{
echo "<td>";
}
if($anzeige_zaehler == 1)
{
if($row['status'] == 0) echo "<a id='...' href='...'> </a>";
elseif($row['status'] == 2) echo "<a id='...' href='...'> </a>";
else echo "<a id='...' href='...'> </a>";
}
if(date("G",$row['zeitpunkt']) == 18)
{
echo "</td>\n";
$uhrzeit_zaehler = 0;
}
if($anzeige_zaehler == 1 AND
date("G",$row['zeitpunkt']) != 18)
$anzeige_zaehler = 0;
else $anzeige_zaehler = 1;
}
Dass ich nur jeden 2. Datensatz anzeige, hat damit zu tun, dass wenn man das so macht, wie ich das realisiert habe, die Tabelle sehr breit wird. Daher soll nur jeder 2. Datensatz angezeit werden (8 Uhr, 10 Uhr usw.)
Jetzt wollte ich fragen, ob es eine Möglichkeit gibt, bereits in SQL zu sagen, dass man nur jeden zweiten Datensatz haben möchte, damit man nicht die Menge an daten hat und dann der Seitenaufbau schneller von statten geht.
Vielleicht habt ihr ja auch noch sonst andere Ideen, um den Seitenaufbau schneller zu machen.
Vielen dank im Vorraus,
mfg, brc
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 29198
Url: https://administrator.de/contentid/29198
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
8 Kommentare
Neuester Kommentar
Hi,
also direkt in MySQL geht das nicht (was mein Wissen angeht). Aber du kannst das mit PHP ganz easy abfragen. Mach einfach ne Vari. Die zählst du jedesmal um 1 hoch. Wenn Sie dann % (Modulo 2 == 0 ist) Dann soll er den Datensatz rauslesen.
Beispiel:
So müsste es theoretisch gehen!
Gruß
Dani
also direkt in MySQL geht das nicht (was mein Wissen angeht). Aber du kannst das mit PHP ganz easy abfragen. Mach einfach ne Vari. Die zählst du jedesmal um 1 hoch. Wenn Sie dann % (Modulo 2 == 0 ist) Dann soll er den Datensatz rauslesen.
Beispiel:
$rest=0;
$sql="SELECT entliehen.status, entliehen.zeitpunkt FROM entliehen WHERE entliehen.geraet='".$row0['id']."' AND entliehen.zeitpunkt>='$time_start_monat'
AND entliehen.zeitpunkt<='".get_ende_monat($time_start_monat)."' ORDER BY
entliehen.zeitpunkt LIMIT $rest, 1;";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
if($rest%2 == 0)
{
.... //DEINE SACHEN
}
$rest++;
}
So müsste es theoretisch gehen!
Gruß
Dani
Kommt darauf an, was für eine DB du benutzt. Bei MySQL funktioniert mein Tipp soviel ich weiß nicht, bei Oracle aber schon:
Benutze rownum... (so werden die Zeilen in der DB durchnummeriert)
allerdings kommt es hierbei darauf an, wie die Sätze gespeichert wurden (der Reihenfolge nach oder nicht)
Probieren geht über studieren...
Benutze rownum... (so werden die Zeilen in der DB durchnummeriert)
allerdings kommt es hierbei darauf an, wie die Sätze gespeichert wurden (der Reihenfolge nach oder nicht)
Probieren geht über studieren...
SELECT ...
<b>WHERE ( rownum % 2 ) = 0</b>
Moin badrulecracker,
ich würde es so versuchen:
$sql="
SELECT
entliehen.status,
entliehen.zeitpunkt
FROM
entliehen
WHERE
entliehen.geraet='".$row0['id']."'
AND
(EXTRACT(HOUR from entliehen.zeitpunkt) %2)= 0
and
entliehen.zeitpunkt>='$time_start_monat'
AND
entliehen.zeitpunkt<='".get_ende_monat($time_start_monat)."'
ORDER BY
entliehen.zeitpunkt;";
Gruß
Biber
ich würde es so versuchen:
$sql="
SELECT
entliehen.status,
entliehen.zeitpunkt
FROM
entliehen
WHERE
entliehen.geraet='".$row0['id']."'
AND
(EXTRACT(HOUR from entliehen.zeitpunkt) %2)= 0
and
entliehen.zeitpunkt>='$time_start_monat'
AND
entliehen.zeitpunkt<='".get_ende_monat($time_start_monat)."'
ORDER BY
entliehen.zeitpunkt;";
Gruß
Biber
Hallo,
es wäre sehr hilfreich wenn du deine kompletten SHOW CREATE TABLE tbl posten würdest.
Hab das dumpfe Gefühl das dein DB Design sehr redundant ist.
Wenn das angepasst ist kannst du das in jeder DB mit einem INNER JOIN lösen.
Gruß
Andi
es wäre sehr hilfreich wenn du deine kompletten SHOW CREATE TABLE tbl posten würdest.
Hab das dumpfe Gefühl das dein DB Design sehr redundant ist.
Wenn das angepasst ist kannst du das in jeder DB mit einem INNER JOIN lösen.
Gruß
Andi
Ich hab versucht das ganze jetzt nochmal zu kapieren, hab alles nochmal durchgelesen.
Ich versteh jetzt aber nicht warum du nur jeden zweiten Datensatz brauchst.
Ich versteh jetzt aber nicht warum du nur jeden zweiten Datensatz brauchst.