Sortierfunktion
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
antwort
anzahl
beitrag
board
button
count
durcheinander
ergebnis
folgende konstrukt
grausame struktur
kategorie
limit
mengen
operation
order
problemkind
session
tabelle
variable
zustand
-
Hallo Leute
Ich setze meine Homepage gerade neu auf. Nicht, dass die alte scheiße wäre oder sowas, aber es fehlen immernoch sehr viele "Standards" und die möchte ich gerne in die neue Homepage mit einbauen.
Also, Mein Forum hat noch keine Sortierfunktion, die alles nach beispielsweise der Anzahl der Beiträge sortiert vorwärts sowie rückwärts.
erreichen kann man das, indem man den "Querrysatz" Dynamisch in einer Variable speichert, und ihn dann ausführt, das ist denke ich mal die einfachste Methode.
nur habe ich jetzt ein kleenes Problem... ich habe Themenüberschriften und Beiträge in unterschiedlichen Tabellen gespeichert, und da schon einiges Vorhanden ist, möchte ich das nicht alles löschen, nur weil ich die Datenbankstrucktur geändert habe... aber wie sortiere ich jetzt die Themen nach der anzahl der Beiträge?gezählt wird beispielsweise so:
$counterantwortenabfrage = "SELECT COUNT(id) FROM rsforumantworten WHERE thementitel LIKE '$id'"; $counterantwortenergebnis = mysql_query($counterantwortenabfrage); $menge = mysql_fetch_row($counterantwortenergebnis); $menge = $menge[0] - 1;
und die Themenabfrage sieht so aus:
$themenabfrage = "SELECT * FROM rsforumthemen WHERE kategorie = '$kategorie' AND fixiert = 'fixiert' ORDER BY id DESC"; $themenergebnis = mysql_query($themenabfrage); while($row = mysql_fetch_object($themenergebnis)) { blah blah blah }
kann ich die Themenabfrage dann so machen, dass ich hinten ORDER BY '$menge' mache, oder wie??? also es muss auf jeden Fall nach der Anzahl sortiert werden.
Wäre sehr nett, wenn ihr mir bei dieser Funktion was zur Seite stehen würdet.
Gruß
Technofan -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Erstmal zur Struktur. Damit man beim Sortieren nicht zu große Abfragen produziert empfiehlt es sich die Antworten/Views/ersten/letzen Beitrag mit im Thread zu speichern. Das spart eine Abfrage und macht das Forum performanter. Ist nur ein wenig mehr Arbeit beim pflegen des ganzen.
Würd dir bei der Abfrage gern helfen, aber ohne die genaue Struktur der beiden Tabellen zu können ist die Abfrage nur schwer zu schreiben ;) -
joa, kein Problem, die Tabellen sehen so aus:
Beiträge: http://technofan.lima-city.de/forumantworten.JPG
Themen: http://technofan.lima-city.de/forumthemen.JPG
Bis auf id und text (longtext) ist in beiden Tabellen alles auf varchar, was ich aber bei den ansichten bald auf int ändern werde, da sonst nicht richtig gelistet wird... hab ich bei meinen Charts gemerkt, sobald ne Zahl bei 10 ist, kommts alles durcheinander.
also, wie man das einmal sortiert, also entweder vorwärts oder rückwärts kann ich mir schon denken, aber wie mans dann anstellt, dass der das beim nächsten mal rückwärts sortiert wird schwierig... vllt sollte man da 2 Buttons machen, der eine sortiert rückwärts und der andere vorwärts, das würde vllt auch beim Konfort punkten... bei lima, muss man ja immer 2 mal klicken XD
Bei mir siend die Themen nämlich order by id Desc gelistet und die ID wird ja net angezeigt... vllt noch nen Button machen, der des alles auf standard setzt... na ja, mal gucken, wie des funzt ^^
//EDIT
PS: bei den Beiträgen entspricht der thementitel der id des entsprechenden Themas. alsp ungefair so
Themen:
id | thementitel
1 | lalala
2 | laaaleeeluuu
Beiträge:
id | thementitel
1 | 1
2 | 1
3 | 2
demnach hätte lalala 2 Beiträge (-1 weil beim erstellen eines Themas ein Beitrag erstellt wird also 1 antwort) und laaaleeeluuu einen Beitrag (auch wieder -1 also keine antwort) so bekomme ich dann eine eindeutige zuweisung hin... damals entsprach der thementitel dem thementitel und da kam mein Forum dann durcheinander, sobald es ein weiteres Thema mit selben Titel gab.
Beitrag geändert: 9.7.2007 23:52:56 von technofan -
Ah...welch grausame Struktur.
Hier erstmal die SQL Anweisung:
$queryString = "SELECT t.id AS tid, t.auto, t.thementitel, t.kategorie, COUNT(a.id) AS antworten FROM rsforumthemen AS t INNER JOIN rsforumantworten AS a ON t.id = a.thementitel ORDER BY antworten ".$ORDER;
Du musst lediglich bei einem Sortierlink abfragen wie die letzte Sortierrichtung war. Normale URL Parameter werden pet GET übertragen, einfach abfragen und DESC durch ASC ersetzen und umgekehrt.
Desweiteren solltest du deine Tabelle normalisieren! Für Autor und Kategorie eine eigene Tabelle anlegen und dann die ID in die entsprechenden Felder von Themen und Antworten eintragen.
Für fixiert/geschlossen reicht eine Spalte mit verschiedenen Werten. Mittel Bit-Operationen könntest du so mehrere Zustände gleichzeitig abbilden.
Spaltennamen würd ich noch ins englische übersetzen und die tabellennamen könnten auch kürzer sein ;)
-
mittels wat kann ich mehrere Zustände machen?
das musste mir jetzt erstmal erklären ^^ -
Na wenn du zb. auf themen.php?sort=desc klickst, dann hast du die GET Variable sort. Bei dieser fragst du den Wert ab und wenn der desc ist, dann wird der link mit sort=asc
aufgebaut.
$sort = !isset($_GET['sort']) && $_GET['sort'] == 'desc' ? 'asc' : 'desc'; echo '<a href="index.php?sort='.$sort.'">Sortieren nach Antworten</a>'.PHP_EOL;
Ganz easy ^^
Beitrag geändert: 10.7.2007 13:42:29 von evil-devil -
aaaaalso
ich bin mit meiner HP mitlerweile so weit, dass man hier auch wieder reinschreiben kann...
undzwar... die Sortierfunktion an sich funktiononiert schon, nur hab ich da ein kleines Prob mit der Session, in der das Sortierargument gespeichert ist...
da ich diese Sortierfunktion auf mehreren Kategorien verwende, muss die Session geändert werden, da sonst die MySQL-Abfrage ein invalides Ergebnis bekommt und somit eine Fhlermeldung erscheint... und genau das bekomme ich net hin, am besten ihr schaut euch das mal selbst an... die Session wird noch mit einer Getvariable gesetzt, und dann übernimmt die Session komplett, ich möchte das Sortierargument nämlich nicht überall mitschicken, weils etwas unschön aussieht...
Hier mal mein Problemkind:
if($_SESSION['content'] == "board") { $_SESSION['content'] = "board"; $_SESSION['order'] = "id DESC"; $order = $_SESSION['order']; if($_SESSION['order'] == "" AND $_GET['order'] == "") { $_SESSION['content'] = "board"; $_SESSION['order'] = "id DESC"; $order = $_SESSION['order']; } elseif($_SESSION['order'] != "" AND $_GET['order'] == "") { $_SESSION['content'] = "board"; $order = $_SESSION['order']; } else { $_SESSION['content'] = "board"; $_SESSION['order'] = $_GET['order']; $order = $_SESSION['order']; } } elseif($_SESSION['order'] != "id DESC") { $_SESSION['order'] = "id DESC"; $order = $_SESSION['order']; } else { $_SESSION['content'] = "board"; $_SESSION['order'] = "id DESC"; $order = $_SESSION['order']; } $abfrage = "SELECT * FROM rsforumthemen WHERE kategorie = '".$_GET['secct']."' ORDER BY fixiert DESC, ".$order." LIMIT $start, $eintraege_pro_seite"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { }
Wie ihr seht is das alles was cappes, ich hoffe, ihr könnt mir da helfen... die einzelnen Kategorien habe ich durch die Session content getrennt, die meines erachtens viel zu früh gesetzt wird... -
Moin, wenn mich meine Montagsmüdigkeit nicht zu sehr ausgenockt hat, dann sollte das folgende Konstrukt die gekürzte Variante von deinem geposteten KOnstrukt darstellen. Hoffe man kann es nachvollziehen, bin noch zu Müde für nähere Erklärungen.
$_SESSION['content'] = "board"; $_SESSION['order'] = "id DESC"; if ($_SESSION['content'] == "board" && isset($_GET['order'])) { $_SESSION['order'] = $_GET['order']; } $order = $_SESSION['order']; $abfrage = "SELECT * FROM rsforumthemen WHERE kategorie = '".$_GET['secct']."' ORDER BY fixiert DESC, ".$order." LIMIT $start, $eintraege_pro_seite"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { }
OT: mit der Kurzschreibweise von IF könnte man es noch kürzer machen ;)
Beitrag geändert: 22.10.2007 9:45:16 von evil-devil -
nein, tut mir leid, das funktioniert leider auch nicht...
er sortiert zwar, aber sobald ich auf Seite 2,3,4,5 u.s.w. auf der Kategorie anwähle (Blätterfunktion) dann geht die ordnung wieder verloren... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage