Thread-Anzeige sortiert nach Beiträgen

lisali

Erfahrenes Mitglied
Hallo,

ich würde gerne mein Forum wie "üblich" sortieren lassen und habe folgendes SQL-Statement geschrieben:

PHP:
$result = mysql_query("
SELECT `board_threads`.id, 
		`board_threads`.bid,
		`board_threads`.art_id,
		`board_threads`.title,
		`board_threads`.user_id,
		`board_threads`.icon,
		`board_threads`.hits,
		`board_posts`.user_id,
		`board_posts`.text,
		`board_posts`.tid,
		DATE_FORMAT(`board_threads`.date,'%d.%m.%y <img alt=\"\" src=\"img/icons/time.gif\" \> %H:%i') AS thread_time,
		DATE_FORMAT(`board_posts`.date,'%d.%m.%y <img alt=\"\" src=\"img/icons/time.gif\" \> %H:%i') AS posting_time
		FROM `board_posts` INNER JOIN `board_threads` 
		ON `board_threads`.id = `board_posts`.tid 
		WHERE `board_threads`.`bid`='".$_GET['bid']."' GROUP BY `board_threads`.`id` ORDER BY `board_posts`.date DESC");

Jetzt ist das komische dabei, dass das GROUP BY irgendwie zu verhindern scheint, dass posting_time (Zeit des letzten Beitrages) sowohl als auch die Zeit der Erstellung des Threads (thread_time) angezeigt wird. Das heißt, es wird schon angezeigt, jedoch ist dann automatisch posting_time der selbe Wert wie thread_time, wenn ich GROUP BY schreibe. Und ich versuche schon lange hin und her und irgendwie komme ich nicht zu der Lösung nach den neuesten Beiträgen in jeweils den vorhandenen Threads zu sortieren.
Wenn ich nun das GROUP BY weglasse, dann werden alle Zeiten richtig angezeigt, jedoch habe ich dann aber auch so viele Thread-Ausgaben wie ich Beiträge habe. Wenn ich z.B. 2 Threads habe und in denen sind verteilt 6 Beiträge, habe ich dann auch 6 Threads, dafür dann aber die richtige Zeit des letzten Beitrages und auch die Sortierung nach dem letzten Beitrags-Datum ist korrekt.
Ich habe es auch schon mit DISTINCT nach dem SELECT probiert, aber da tut sich nichts.

Woran könnte das liegen?

Bin dankbar für jede Hilfe!

Vielen Dank.

Liebe Grüße,

Lisa
 
Hi,

irgendwie verstehe ich nicht so ganz wo du hin willst ^^

Also ich denke erstmal macht es kein Sinn ein
Code:
GROUP BY `board_threads`.`id`
zu machen wenn du
Code:
WHERE `board_threads`.`bid`='".$_GET['bid']."'
machst. -> durch das where bekommst du doch eh nur alle Post von dem einen Thread mit der ID aus '".$_GET['bid']."'.

weiterhin:
Wenn ich nun das GROUP BY weglasse, dann werden alle Zeiten richtig angezeigt, jedoch habe ich dann aber auch so viele Thread-Ausgaben wie ich Beiträge habe. Wenn ich z.B. 2 Threads habe und in denen sind verteilt 6 Beiträge, habe ich dann auch 6 Threads
das bezweifele ich ^^
Du hast dann nicht 6 Threads sondern 6 Zeilen mit der selben ThreadId in `board_threads`.bid, falls dieser Thread 6 Posts hätte.

Oder habe ich da jetzt was falsch verstanden?
 
Also, man müsste sich das einfach so vorstellen wie bei diesem Forum, dass eben die Threads danach sortiert werden in welchem Thread sich der neueste Beitrag befindet. Dieser Thread ist dann ganz oben, was ich mit "üblich" meinte vorhin.

Mit

PHP:
WHERE `board_threads`.`bid`='".$_GET['bid']."'

bestimme ich aber, dass in diesem Board (Unterkategorie von mehreren Boards einer Oberkategorie) nur Threads dieses Boards - also dieser Board-ID - angezeigt werden.

Du hast dann nicht 6 Threads sondern 6 Zeilen mit der selben ThreadId in `board_threads`.bid, falls dieser Thread 6 Posts hätte.

Nein, ich hab es ja mehrfach getestet. Ich habe z.B. 2 Beiträge in einem Thread und 4 in einem anderen. Wenn ich das GROUP BY jetzt weglasse, werden die Threads sortiert nach den Beiträgen angezeigt, etwa nach diesem Schema, wenn A erster Thread ist und B der zweite:

Also werden die Thread sozusagen als Beiträge behandelt und nicht als Threads.

LG,

Lisa
 
k dann brauchst du natürlich das group by

dann häng mal noch die zeit an das group by dran
Code:
GROUP BY `board_threads`.`id`, `board_posts`.date
 
Das funktioniert leider auch nicht. Dann kommt wieder dieses Schema wie in meinem vorigen Post.

LG,

Lisa
 
Hi Lisa,

Jetzt ist das komische dabei, dass das GROUP BY irgendwie zu verhindern scheint, dass posting_time (Zeit des letzten Beitrages) sowohl als auch die Zeit der Erstellung des Threads (thread_time) angezeigt wird.

das ist nicht komisch, sondern völlig logisch. Du wählst eine Spalte aus, über die weder gruppiert, noch aggregiert wird und die unterschiedliche Werte pro Gruppe hat. Woher soll der Server wissen, welchen Wert Du haben willst? Die Werte in den Spalten user_id und text dürften genauso willkürlich ausgewählt sein. Dass der Server diese Abfrage überhaupt ausführt, liegt daran, dass MySQL da tolerant ist, falls es nicht im ONLY_FULL_GROUP_BY Mode läuft.

Lies am besten mal im Handbuch nach:

Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.

Dort findest Du dann auch gleich einen Link auf einen anderen Abschnitt mit möglichen Lösungen für dieses Problem.

LG
 
Zurück