Ist auch nicht falsch es so zu lösen. Aber irgendwann kommt man an einen Punkt, wo man die Performance mal gegenüber stellen muss. Gerade bei einem Forum, wo in erster Linie die Lese-Operationen überwiegen. Da darf man gerne beim erstellen der Postings ein-zwei Queries mehr benötigen, wenn es das auslesen beschleunigt.
Tabellenlayout sinnvoll?
Einklappen
X
-
Neues und wichtigeres Problem ;-)
Ich hab jetzt festgestellt, dass mir folgende Abfrage je nach Anzahl der Threads, die existieren mehr Datensätze liefert.
Eigentlich wollte ich nur, dass er mir für jedes Thema (welches der kategorie untergeordnet ist) einen Datensatz zurückliefert.
Bei 6 Themen wären das also 6 Datensätze.
Ich bekomme aber 30 Datensätze.
Es existieren 24 Threads, 6 Themen und 4 Kategorien...
PHP-Code:SELECT
kategorien.category_id,
kategorien.category_order,
kategorien.category_name,
themen.thema_id,
themen.thema_name,
threads.thread_name,
userdaten.user_id,
userdaten.username,
infos.post_id,
infos.poster_id,
infos.post_time,
infos.thread_id,
(
SELECT
COUNT(*)
FROM
forum_threads AS threads2
WHERE
threads2.thema_id = threads.thema_id &&
threads2.deleted = 0
) AS themenanzahl,
(
SELECT
COUNT(*)
FROM
forum_post_info AS infos2
INNER JOIN
forum_threads AS threads3 USING(thread_id)
WHERE
threads3.thema_id = threads.thema_id &&
threads3.deleted = 0
) AS beitragsanzahl
FROM
forum_kategorien AS kategorien
LEFT JOIN
forum_themen AS themen USING(category_id)
LEFT JOIN
forum_threads AS threads ON threads.thema_id = themen.thema_id && threads.deleted = 0
LEFT JOIN
forum_post_info AS infos USING(thread_id)
LEFT JOIN
phpbb_users AS userdaten ON userdaten.user_id = infos.poster_id
ORDER BY
kategorien.category_order ASC,
themen.thema_id ASC,
infos.post_time ASC
Ich habe schon ein group By themen.thema_id versucht. Das hat bis auf einen kleinen aber feinen Unterschied funktioniert:
Ich bekomme nichtmehr den neuesten Thread, sondern den ältesten angezeigt.
Meine Frage an die Profis ;-)
Wie kann ich trotz des GROUP BY erreichen, dass MySQL mir den neuesten Thread anzeigt?
Ich komme einfach auf keine Lösung :-(
MfG
Seggl-hoch-drei
EDIT:
Ich hab hier die gleiche Abfrage wie oben nochmal, diesmal aber ohne die Berechnung der Gesamtanzahl der Threads und Beiträge (übersichtlicher):
PHP-Code:SELECT
kategorien.category_id,
kategorien.category_order,
kategorien.category_name,
themen.thema_id,
themen.thema_name,
threads.thread_name,
userdaten.user_id,
userdaten.username,
infos.post_id,
infos.poster_id,
infos.post_time,
infos.thread_id
FROM
forum_kategorien AS kategorien
LEFT JOIN
forum_themen AS themen USING(category_id)
LEFT JOIN
forum_threads AS threads ON threads.thema_id = themen.thema_id && threads.deleted = 0
LEFT JOIN
forum_post_info AS infos USING(thread_id)
LEFT JOIN
phpbb_users AS userdaten ON userdaten.user_id = infos.poster_id
ORDER BY
kategorien.category_order ASC,
themen.thema_id ASC,
infos.post_time ASC
Kommentar
-
Bin mir jetzt nicht sicher, ob das hier genau weiterhilft, aber nen Freund hatte mal ein ähnliches Problem und ihn auf ich auf dieses Thema verwiesen:
ORDER_BY_ignoriert_mit_GROUP_BY
Je nach dem, vlt dann eher MIN()..
mfg
Kommentar
-
Vielleicht hier mal das SQL-Satement der Themenübersicht.
Denn hier klappt die Sache!
PHP-Code:SELECT
threads.thread_name, threads.thread_id, threads.thread_fixed, threads.thread_locked,
( SELECT COUNT(*) FROM forum_polls WHERE thread_id= threads.thread_id ) AS thread_vote,
themen.thema_name,
kategorie.category_id, kategorie.category_name,
erster_post.poster_id AS first_poster_id, first_user_name.username AS authorname,
letzter_post.poster_id AS last_poster_id, last_user_name.username AS last_poster_name, letzter_post.post_time AS last_post_time,
(
SELECT
COUNT(*)
FROM
forum_post_info AS infos2
WHERE
infos2.thread_id = threads.thread_id
) AS beitragsanzahl
FROM forum_themen AS themen
LEFT JOIN
(
SELECT
category_id, category_name
FROM
forum_kategorien
) AS kategorie
ON kategorie.category_id = themen.category_id
LEFT JOIN forum_threads AS threads
ON threads.thema_id = themen.thema_id && threads.deleted = 0 /* darf nicht in WHERE-Klausel stehen, weil sonst keine leeren Themen gefunden werden */
LEFT JOIN
(
SELECT
poster_id, post_id, post_time, thread_id
FROM
forum_post_info
WHERE
post_id = (
SELECT
MIN(post_id)
FROM
forum_post_info AS p2
WHERE
p2.thread_id = forum_post_info.thread_id
GROUP BY
p2.thread_id
)
) AS erster_post
ON erster_post.thread_id = threads.thread_id
LEFT JOIN phpbb_users AS first_user_name
ON first_user_name.user_id = erster_post.poster_id
LEFT JOIN
(
SELECT
poster_id, post_id, post_time, thread_id
FROM
forum_post_info
WHERE
post_id = (
SELECT
MAX(post_id)
FROM
forum_post_info AS p3
WHERE
p3.thread_id = forum_post_info.thread_id
GROUP BY
p3.thread_id
)
) AS letzter_post
ON letzter_post.thread_id = threads.thread_id
LEFT JOIN phpbb_users AS last_user_name
ON last_user_name.user_id = letzter_post.poster_id
LEFT JOIN forum_post_info AS info
ON info.thread_id = threads.thread_id
LEFT JOIN phpbb_users AS userdaten
ON info.poster_id = userdaten.user_id
WHERE themen.thema_id = ".$id_thema."
GROUP BY threads.thread_id
ORDER BY threads.thread_fixed DESC, last_post_time DESC;
Vielleicht noch ein Hinweis:
Mein Forum ist so aufgebaut, dass es Kategorien gibt. In diesen Kategorien gibt es verschiedene Themen und in diesen Themen kann man Threads erstellen.
Der oben gepostete Code liefert mir die Threads in einem thema.
Da habe ich es mit einem Subselect hinbekommen, aber ich habe keine Ahnung, wie ich das auf meine Kategorienübersicht übertragen kann!
Seggl hoch drei
Kommentar
-
Original geschrieben von Seggl-hoch-drei
Der oben gepostete Code liefert mir die Threads in einem thema
Kommentar
-
Und wenn du das so in PhpMyAdmin ausführst, wie lange ist die Abfragedauer?
Kommentar
Kommentar