Distict oder Group By sortieren
Peppy
- datenbank
0 Peppy0 Thomas Luethi0 Peppy0 Thomas Luethi0 Peppy
0 wahsaga
Hallo zusammen,
ich hab ein kleines Forum programmiert.
Die Themen werden per DISTICT ausgelesen und verlinkt.
Mein Problem ist, das ich das ganze nicht wirklich sortieren kann.
Ich will, dass die Datenbank nach der Absendezeit sortiert wird und dann die Themen ausgelesen werden.
Die abfrage sieht wie folgt aus:
$result = mysql_query("SELECT thema, main FROM $tabellenname_7 WHERE abszeit > $zeit_vor_10_tagen GROUP BY thema, main ORDER BY abszeit DESC",$connectionid);
oder aber
$result = mysql_query("SELECT DISTINST thema, main FROM $tabellenname_7 WHERE abszeit > $zeit_vor_10_tagen ORDER BY abszeit DESC",$connectionid);
Beides klappt nicht so, wie ich es gerne hätte.
Ich denke, dass zunächst die einzelnen Themen ausgelesen werden und diese einzelnen Themen dann nach dem Datum sortiert werden.
Jedes Posting hat in der Datenbank neben dem Inhalt auch das Thema und die Absendezeit gespeichert.
Letztendlich soll es so werden, dass Themen, zu denen schon länger nicht mehr geschrieben wurde in einer anderen Navigation verlinkt werden sollen.
Damit ihr euch ein besseres Bild machen könnt: der Link steht oben.
Hab schon im Forum und auf mysql.de geschaut, aber ich werde einfach nicht schlauer.
$result = mysql_query("SELECT thema, main, MAX(abszeit) as max_abszeit FROM $tabellenname_7 WHERE abszeit > $zeit_vor_10_tagen GROUP BY thema ORDER BY max_abszeit DESC",$connectionid);
Damit klappt jetzt die Sortierung.
Aber ältere Beiträge kann ich nicht von neueren unterscheiden.
Das hängst wohl damit zusammen, dass in einem Thema sowohl ein zu alter als auch neuer Beitrag steht.
Ich bekomme also teilweise Themen doppelt aufgelistet.
Hallo,
Die Themen werden per DISTICT ausgelesen und verlinkt.
Du schreibst es immer wieder falsch.
(Im Subject, hier und auch unten im Quelltext. Bitte Quelltext Copy-Pasten,
damit nicht noch solche Fehler reinkommen!)
Es heisst DISTINCT.
Warum brauchst Du das ueberhaupt? Warum kriegst Du Mehrfachtreffer?
Mein Problem ist, das ich das ganze nicht wirklich sortieren kann.
Ich will, dass die Datenbank nach der Absendezeit sortiert wird und dann die Themen ausgelesen werden.
ORDER BY abszeit
sollte eigentlich reichen. In welcher Form ist die Zeit gespeichert?
Hoffentlich in DATETIME.
Wenn es im TIMESTAMP Format ist, und es die erste bzw. einzige
Spalte in diesem Format ist, dann wird sie automatisch angepasst,
sobald sich in der Zeile etwas aendert.
Die abfrage sieht wie folgt aus:
$result = mysql_query("SELECT thema, main FROM $tabellenname_7 WHERE abszeit > $zeit_vor_10_tagen GROUP BY thema, main ORDER BY abszeit DESC",$connectionid);
oder aber
$result = mysql_query("SELECT DISTINST thema, main FROM $tabellenname_7 WHERE abszeit > $zeit_vor_10_tagen ORDER BY abszeit DESC",$connectionid);
Beides klappt nicht so, wie ich es gerne hätte.
Ich denke, dass zunächst die einzelnen Themen ausgelesen werden und diese einzelnen Themen dann nach dem Datum sortiert werden.
Mir ist nicht klar, was Du willst und/oder denkst.
ORDER BY kann auch mehrere Argumente haben.
"ORDER BY thema, abszeit" sortiert zuerst nach thema, und dann innerhalb
eines Themas nach dem Datum. Das ist vermutlich, was Du willst.
("ORDER BY abszeit, thema" wuerde die Postings "wild durcheinander"
in der Reihenfolge des Absendens auflisten. Falls zwei Postings per
Zufall in der gleichen Sekunde abgeschickt worden waeren, wuerde
dann noch als zweites Sortiermerkmal das Thema angeschaut.
Das ist vermutlich nicht, was Du willst. Du schreibst ja, dass Du ein
"Forum" hast, und nicht, dass Du ein "Board" hast;-)
Jedes Posting hat in der Datenbank neben dem Inhalt auch das Thema und die Absendezeit gespeichert.
Damit ihr euch ein besseres Bild machen könnt: der Link steht oben.
Du meinst wohl die rechte Spalte in
http://www.kegelkoenige.de/ruhrpottkegler/forum.php
Das ist aber nur das Resultat.
Interessanter waere zu wissen: Wie sieht Deine Datenbank-Tabelle aus?
Spaltennamen, Muster-Inhalte bitte!
Gruesse,
Thomas
Die Themen werden per DISTICT ausgelesen und verlinkt.
Du schreibst es immer wieder falsch.
War nur ein Fehler in meinem Beitrag, nicht aber im Quelltext.
Warum brauchst Du das ueberhaupt? Warum kriegst Du Mehrfachtreffer?
Siehe unten, wo die Tabellenstrucktur ist.
Denke mal es liegt daran, dass ich nur eine Tabelle für das Forum/ Board benutze.
ORDER BY abszeit
sollte eigentlich reichen. In welcher Form ist die Zeit gespeichert?
Von den versicheidenen Formen habe ich leider keine Ahnung.
Hatte noch keine Zeit mich damit näher zu beschäftigen.
Es ist die Unixzeit die in der Dazenbank als varchar(10) gespeichert wird.
Es läuft gut, also sah ich keinen Grund das zu ändern.
"ORDER BY thema, abszeit" sortiert zuerst nach thema, und dann innerhalb
eines Themas nach dem Datum. Das ist vermutlich, was Du willst.
Das sollte ich mal versuchen.
Mir ist heute morgen nach dem Aufwachen aufgefallen,
dass ich einen Denkfehler habe. Vielleicht klappt es auf deinem Weg.
Das muss ich heute abend testen.
Mir ist nicht klar, was Du willst und/oder denkst.
Ich will, dass Themen zu denen länger als (z.b.) 10 Tage nichts mehr geschrieben wurden in der rechten navigation seperat aufgelistet werden.
Der Denkfehler wird der sein:
Ich frage ja mit WHERE ab, ob Datnsätze älter oder neuer als eine Bestimmte Zeit sind.
Da zu einem Thema aber beides der Fall seien kann, bekomme ich doppelte Einträge raus.
Im Moment wird auf meinem Board zwar alles nach Datum sortiert ausgegeben, aber oben in der rechten Spalte sind die neuesten 7 aufgelistet. Und alle anderen sind unten aufgeführt.
Ich habe also keine Abfrage drin, ob ein Datensatz ein bestimmtes alter überschreitet, weil ich das gestern noch nicht hinbekommen habe.
Ich muss mir also eine andere Struktur für die Abfrage einfallen lassen.
Ich hoffe du verstehst was ich meine, auch wenn alles vielleicht etwas wirr von mir beschrieben wird.
"Forum" hast, und nicht, dass Du ein "Board" hast;-)
Gut, dann ist es ein Board.
Du meinst wohl die rechte Spalte in
http://www.kegelkoenige.de/ruhrpottkegler/forum.php
Das ist aber nur das Resultat.
Ja, es geht hier um die rechte Spalte.
Interessanter waere zu wissen: Wie sieht Deine Datenbank-Tabelle aus?
Spaltennamen, Muster-Inhalte bitte!
Gruss,
Peppy
Hallo,
Siehe unten, wo die Tabellenstrucktur ist.
Denke mal es liegt daran, dass ich nur eine Tabelle für das Forum/ Board benutze.
Ja, das DB-Design ist wohl nicht ganz optimal.
Das Prinzip eines einfachen "richtigen" Forums mit Threads und Baumstruktur
ist beschrieben unter:
http://aktuell.de.selfhtml.org/artikel/phpasp/php-forum/index.htm
In welcher Form ist die Zeit gespeichert?
Es ist die Unixzeit die in der Dazenbank als varchar(10) gespeichert wird.
Es läuft gut, also sah ich keinen Grund das zu ändern.
Fuer Zeitpunkte nimmt man am besten das DATETIME Format.
Dann kann man auch gleich in der SQL-Query am einfachsten
Daten vergleichen u.s.w.
»» »» "ORDER BY thema, abszeit" sortiert zuerst nach thema, und dann innerhalb
eines Themas nach dem Datum. Das ist vermutlich, was Du willst.
Das sollte ich mal versuchen.
Mir ist heute morgen nach dem Aufwachen aufgefallen,
dass ich einen Denkfehler habe. Vielleicht klappt es auf deinem Weg.
Das muss ich heute abend testen.
Tue das.
Der Denkfehler wird der sein:
Ich frage ja mit WHERE ab, ob Datnsätze älter oder neuer als eine Bestimmte Zeit sind.
Da zu einem Thema aber beides der Fall seien kann, bekomme ich doppelte Einträge raus.
Ja, das sehe ich auch als das Problem.
Ich muss mir also eine andere Struktur für die Abfrage einfallen lassen.
Oder besser gleich ein anderes DB-Design.
Ich hoffe du verstehst was ich meine, auch wenn alles vielleicht etwas wirr von mir beschrieben wird.
Ja, langsam sehe ich, was Du willst.
Ich stosse aber mit meinen SQL-Kenntnissen an die Grenzen,
vielleicht kann sonst noch jemand weiterhelfen...
Wie sieht Deine Datenbank-Tabelle aus?
- nummer + main + name + thema + nachricht + abszeit +
+1 +1 +Max +Thema1 + Text1 +10283729 +
+2 +1 +Hans +Thema1 + Text2 +10284729 +
+3 +2 +Klaus +Thema2 + Text3 +10223729 +
+4 +2 +Karl +Thema2 + Text4 +10284549 +
Wenn Du wirklich nur diese eine Tabelle hast, musst Du
evtl. wirklich mit DISTINCT arbeiten.
Ein Versuch waere z.B. folgendes (aus dem hohlen Bauch):
SELECT thema, main DISTINCT FROM Tabelle
WHERE abszeit<$grenzzeit
ORDER BY abszeit DESC, main.
Als Hilfsmittel/Kruecke koenntest du eine zusaetzliche Spalte
"letztzeit" machen, in der Du jeweils (bei allen Zeilen zu
einem bestimmten Thread) das Datum speicherst,
an dem in dem betreffenden Thread/Thema etwas hinzukam.
Doch wie gesagt, wahrscheinlich solltest Du eine bessere
Tabellenstruktur ohne Redundanz aufbauen.
Gruesse,
Thomas
Hallo,
Das Prinzip eines einfachen "richtigen" Forums mit Threads und Baumstruktur
ist beschrieben unter:
http://aktuell.de.selfhtml.org/artikel/phpasp/php-forum/index.htm
Tja, das sehen meine Kegelbrüder leider anders.
Ich hatte zu testzwecken mal ein kostemloses installiert.
Aber danach wurde eine Strucktur eines Boardes verlangt....
Oder besser gleich ein anderes DB-Design.
Wohl erst beim nächten Forum.
Ich werde morgen erstmal deine beiden anderen Vorschläge testen:
SELECT thema, main DISTINCT FROM Tabelle
WHERE abszeit<$grenzzeit
ORDER BY abszeit DESC, main.
Als Hilfsmittel/Kruecke koenntest du eine zusaetzliche Spalte
"letztzeit" machen, in der Du jeweils (bei allen Zeilen zu
einem bestimmten Thread) das Datum speicherst,
an dem in dem betreffenden Thread/Thema etwas hinzukam.
Und dann melde ich mich nochmal.
Danke,
Peppy
hi,
Die Themen werden per DISTICT ausgelesen und verlinkt.
wenn dies nicht ohne distinct möglich ist, solltest du dein datenmodell überdenken.
distinct ist eigentlich so gut wie nie ratsam (performance-fresser), und ein anzeichen für ein falsches datenmodell.
gruss,
wahsaga