&SQL: Wie kann ich ausgaben über mehrere seiten verteilen
Crytec
- php
Mir ist bekannt dass ich eine ausgabe über LIMIT x,x natürlich über mehrere Seiten verteilen kann... aber wie mache ich es bei sonder-selektionen?
Sprich:
SELECT * FROM X WHERE id ='Y'
er selecttiert nun goldende
1. Käse__ Id X
2. Kuchen ID Y <selektiert
3. Banane ID Z
4. Torte_ ID Y <selektiert
5. Apfel_ ID Z
//Kommentar: x=milchprodukt y=backware z=frucht
Nun kann ich aber ja ncihtmehr sagen limi 1,10 da ja nicht jeder wert genommen wurde...
eine idee?
ciao
Hi,
Nun kann ich aber ja ncihtmehr sagen limi 1,10 da ja nicht jeder wert genommen wurde...
Das müsste auch so gehen. Er sortiert nicht nach ID sondern nach den die du selektest. Hast dus denn schonmal ausprobiert?
Hello,
Nun kann ich aber ja ncihtmehr sagen limi 1,10 da ja nicht jeder wert genommen wurde...
Das müsste auch so gehen. Er sortiert nicht nach ID sondern nach den die du selektest. Hast dus denn schonmal ausprobiert?
SIE numeriert die Trefferliste durch und nutzt offset und limit.
Es heißt nämlich DIE Datenbank und nicht der Datenbank *ggg*
Es gab hier die letzten Tage schon einen Thread zu diesem Thema.
Da eine benutzerspezifische Selektion von Daten i.d.R. nicht in die Bookmarks oder Suchmaschinen aufgenommern werden soll, kann man das Blättern getrost mit einem Formular machen und nicht mit Links. Einemm Formular kann man nun auch Parameter in einem hidden-feld mitgeben.
Je nachdem, wie dynamisch der Datenbestand im Filterbereich ist, sollte man die Strategie dann auch wählen. Man kann die Suche zum Suchzeitpunkt komplett durchführen und sich die IDs des Ergebnisses merken (Snapshot) oder man kannn die Suche auf jeder Seite wiederholden lassen und nur eine Verschiebung (offest) des Aufsetzpunktes in der Ergebnisliste durchführen. Dabei sollte man aber nicht vergessen, dass man bei der dynamischen Suche jedesmal eine andere Ergebnisliste bekommt und so je nach Veränderung des Datenbestandes, dem Filter und der Sortierung dabei ein ganz unergonomisches Programmverhalten herauskommen kann.
Wenn die Ergebnismenge der Suche also nicht zu groß ist, würde ich immer die IDs in einem Set in einer Session speichern oder und z.B. Base64-codiert in einem Hidden-Feld an den Client mit ausliefern. Beim Vor oder zurückblättern wird dieses Set dann benutzt, um auf dem Server die passende Seite bereitzustellen. Man schneidet einfach ein Stück von dem Set raus und führt das Select damit durch
select <fields> from <table> where ID in (<subset>)
$set=(10,15,20,55,99,1013,199,7005789)
--------
seite 1 ----------
seite 2 -----------
seite 3
Ich suche dafür allerdings immer noch nach einer Möglichkeit der Drehung der Daten um 90°...
also aus:
1
2
3
...
mache 1, 2, 3, ...
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi
select <fields> from <table> where ID in (<subset>)
$set=(10,15,20,55,99,1013,199,7005789)
--------
seite 1 ----------
seite 2 -----------
seite 3
ab hier verstehe ich es nichtmehr... wie weist du SEITE 1, SEITE 2... etc den werten dort zu?
Ich suche dafür allerdings immer noch nach einer Möglichkeit der Drehung der Daten um 90°...
*lacht*
Kannst sie ja als Grafik schreiben... und drehen.. und durch einen Reader das Bild wieder in werte zurückgeben lassen =)
Was natürlich unsinn wäre =)
ciao
yo,
du arbeitest weiter mit dem limit nur dass du in der WHERE klausel bei der abfrage eine weitere bedingungen mit rein nimmst und zwar so, dass nur die id-werte der ausgewählten datensätze mit in die ergebnistabelle gelangen.
SELECT ....
FROM ....
WHERE ....
AND id IN (hier die liste der ausgewählten ID's durch komma getrennt)
LIMIT x, 10
Ilja
Hello Ilja,
du arbeitest weiter mit dem limit nur dass du in der WHERE klausel bei der abfrage eine weitere bedingungen mit rein nimmst und zwar so, dass nur die id-werte der ausgewählten datensätze mit in die ergebnistabelle gelangen.
SELECT ....
FROM ....
WHERE ....
AND id IN (hier die liste der ausgewählten ID's durch komma getrennt)
LIMIT x, 10
Das ist ja irgendwie eine geniale Idee, insbesondere, wenn die IDs sowieso auf dem Server in der Session liegen...
Jetzt müsste man das erste Select nur noch sofort in eine solche Liste packen können, anstatt es in einem Resultset als Zeilenelement zu bekommen. Hast Du da auch noch eine Idee?
Ich prokel hier schon ne Weile mit select into outfile rum. Das ist aber keine Lösung für den "Normal-Webmaster", weil der meistens keinen Zugriff auf die MySQL-Verzeichnisse hat bzw. die ini verschrauben kann.
Liebe Grüße aus http://www.braunschweig.de
Tom
Das ist ja irgendwie eine geniale Idee, insbesondere, wenn die IDs sowieso auf dem Server in der Session liegen...
Ich versteh kaum noch ein wort =/
HAt jemand mal ein konkretes codebeispiel.... welches ich nehmen knn und das geht.. und ich daran so lange schieben kann bis es auf meine anforderungen passt?
ciao
yo,
HAt jemand mal ein konkretes codebeispiel.... welches ich nehmen knn und das geht.. und ich daran so lange schieben kann bis es auf meine anforderungen passt?
wie gesagt, bleibe bei deinem LIMIT und packe es zusammen mit der WHERE Klausel, da es sich immer nur auf die ergebnistabelle bezieht. wenn in deinem falle die selektion über das "Y" erfolgt und nicht über einzelne id's, dann...
SELECT * FROM X WHERE id ='Y' LIMIT x,y;
Ilja
yo,
Hast Du da auch noch eine Idee?
um ehrlich zu sein, mir ist noch nicht ganz klar, was deine ausgangssituation ist und was du erreichen willst....
Ilja
Hello,
select <fields> from <table> where ID in (<subset>)
$set=(10,15,20,55,99,1013,199,7005789)
--------
seite 1 ----------
seite 2 -----------
seite 3ab hier verstehe ich es nichtmehr... wie weist du SEITE 1, SEITE 2... etc den werten dort zu?
Das mache ich nach gutdünken.
Angenommen, man hat nicht 8 IDs ermittelt mit der Abfrage, sondern 132, dann stehen die eben der Reihe nach, so wie die Sortierung es vorschrieb, in diesem Set. Und nun entscheide ich mich, immer 9 Datensätze auf einer Seite anzuzeigen. Wie könnte ich denn über einen Index auf diese IDs zugreifen?
PHP bietet für diese Dinge leistungsstarke Array-Funktionen. Man könnte also das Set in ein Array übertragen (wenn es da nicht schon drin steht) und dann mit array_slice() einen Teil rausschneiden
http://de3.php.net/manual/de/function.array-slice.php
$_subset = array_slice($_set,($page-1)*$anzahl,$anzahl);
$subset = implode(',',$_subset);
$sql = "select $fieldset from $tabelle where ID_$tabelle in ($subset)";
und Schuss!
Man könnte sich natürlich auch Stringfunktionen selber basteln. MySQL bietet solche Funktionen bereits (fast) fertig. Man zählt einfach die Kommata und schneidet das Stück raus.
-----------------
Ich suche dafür allerdings immer noch nach einer Möglichkeit der Drehung der Daten um 90°...
*lacht*
Kannst sie ja als Grafik schreiben... und drehen.. und durch einen Reader das Bild wieder in werte zurückgeben lassen =)
Was natürlich unsinn wäre =)
Ja, wenn vertikale Daten damit korizontal werden?
Liebe Grüße aus http://www.braunschweig.de
Tom