Top10 Denkanstoss

CrushLog

Erfahrenes Mitglied
Hi,

ich bin grad dabei eine kleine Top10 Statistik zu machen und habe mal wieder ein kleines Denkproblem...
Ausgegeben werden sollen verschiende Top10 Statistiken unter anderem Top10 nach Forum Posts.
Wie fang ich es nun am besten an, dass der User rausgesucht wird, der die meisten Forum Posts gemacht hat? Ich hoffe ihr versteht meine Fragestellung, ich bin nämlich grad ziemlich aufgeschmissen, kann nicht richtig nachdenken, und weiss selber nicht genau, wie ich meine Frage formulieren soll :]

Danke im Voraus!
 
Hallo,

ein paar mehr Infos wären ganz interessant. Zumindest, woher du deine Daten bekommst. Ich gehe jetzt einfach mal von einer MySQL-Datenbank aus. Damit sollte folgendes funktionieren:

PHP:
SELECT * FROM users ODER BY postingzahl LIMIT 0,10;
Damit wählst du 10 User aus deiner Tabelle, aufsteigend sortiert nach Postingzahl. Tabellenname und -spalte sind natürlich anzupassen.
 
Ah, ok, sorry.

Also die Einträge selber stehen in nicht mit in der User Tabelle. Ich müsste sie über eine andere Tabelle identifizieren, in der die Postings drin stehen, aufgebaut wie folgt:

id
userid
boardid
threadid
topic
content
time
ip

Wäre es einfacher, wenn ich alle Posts des User zählen lasse und mit in die User Tabelle eintragen lasse?
 
Das Problem wäre eigentlich so blöd zu lösen, da du jedes mal enorm hohe, lange Datenbankanfragen absenden würdest!

Besser ist du legst in die User Tabelle eine Splate ein. Und führst mittels

PHP:
mysql_query("SELECT COUNT(*) FROM forumpost WHERE userid='dieuseriddesuser'");

und trägst dann dis Anzhal in die User Tabelle ein. Damit das nicht ständig ist, kannst du das durchführen, sobald der User sich einloggt, und nach dem er einen Beitrag geschrieben hat.

Jetzt kannst du einfach auslesen mit ORDER BY spaltemitbeitrgen LIMIT 10
....
 
Ich würde sagen, es ist nicht erforderlich die Tabellenstruktur umzustellen, dein Problem ließe sich nämlich wie folgt lösen:

PHP:
SELECT u.user_id, u.user_nick, COUNT(u.user_id) AS user_posts  
FROM <user_table> AS u, <posting_table> AS p
WHERE u.user_id = p.userid
GROUP BY user_id, user_nick
ORDER BY user_posts DESC
LIMIT 0, 10

Kleiner Tipp: Prefixe deine Spaltennamen, z.B: post_id, post_user_id, post_time, usw.

Gruß
Marvin
 
@Lukas
Das wäre die Möglichkeit, die ich auch in Erwägung ziehe, aber dafür müsste ich die Struktur umstellen, was ein bisschen nervig ist, da ich die Seite parallel bei und im Inet (als 'Betatest') laufen habe und zwischen durch Bugs fixe.

@Marvin
Kannst du mir diesen Query vielleicht genauer erklären, wenn ich ehrlich bin steig ich da nicht so ganz durch :]
 
Zuletzt bearbeitet:
Okay, bauen wir das Query mal in einzelnen Schritten auf:

PHP:
SELECT user_id, user_nick
FROM <user_table>

Das würde von allen Usern, die in <user_table> stehen, die user_id und den user_nick zurückgeben. (Siehe Abb. 1)

tut_1.jpg

Abb. 1


PHP:
SELECT u.user_id, u.user_nick
FROM t3r_users AS u, <post_table> AS p
WHERE p.post_user_id = u.user_id

Das würde uns für jeden Post die user_id und den user_nick zurückgeben. Da wir auf zwei Tabellen zugreifen, bietet es sich an die Spaltennamen zu prefixen, da es vorkommen kann dass ein Spaltenname in beiden Tabellen vorkommt. (Siehe Abb. 2)

tut_2.jpg

Abb. 2

Da wir nicht zu jeden Post wissen wollen, wer ihn verfasst hat und wie seine ID ist, sondern wie viele Posts der User gemacht hat, gruppieren wir das Ganze mit "GROUP BY user_id" und zählen mittels COUNT wie viele Zeilen dabei gruppiert werden und sagen, dass dieser Wert in der Spalte user_posts zurückgegeben werden soll. Das Ganze sieht dann so aus und liefert das Ergebnis was man in Abbildung 3 sehen kann.

PHP:
SELECT u.user_id, u.user_nick, COUNT(u.user_id) AS user_posts
FROM <user_table> AS u, <post_table> AS p
WHERE p.post_user_id = u.user_id
GROUP BY user_id

tut_3.jpg

Abb. 3

Was sticht einem gleich ins Auge? - Ja, genau, es ist nicht nach der Anzahl der Posts geordnet. Dies lässt sich ganz leicht ändern, indem wir ein "ORDER BY user_posts DESC" (= descending = absteigend, es soll ja schließlich der User mit der höhsten Postzahl oben stehen) hinzufügen. Damit die Nicks mit gleicher Postanzahl dann noch alphabetisch geordnet sind setzen wir noch ein ", user_nick ASC" hinten dran. Dazu noch ein "LIMIT 0, 10", damit nicht mehr als 10 aufgelistet werden, und es ist geschafft. (Siehe Abb. 4)

PHP:
SELECT u.user_id, u.user_nick, COUNT(u.user_id) AS user_posts
FROM <user_table> AS u, <post_table> AS p
WHERE p.post_user_id = u.user_id
GROUP BY user_id, user_nick ASC
ORDER BY user_posts DESC
LIMIT 0, 10

tut_4.jpg

Abb. 4

Gruß
Marvin
 
Moechte nichts zum Thema sagen, aber ein grosses Lob an Marvin Schmidt geben!

Es ist einfach toll, selbst als Dritter zu sehen, wie jemandem mit soviel Engagement uebers Internet geholfen wird. Und mir hat deine ausfuehrliche Erklaerung auch was gebracht: Ich verstehe den sicherlich nicht simplen Query jetzt.

Danke!
 
Kann mich da nur anschliessen, absolut super von dir, dass du den Query hier nochmal so expliziet erklärst! Jetzt hab ichs auch verstanden, brauch dafür immer etwas länger :]
 
Zurück