Das zweite Maximum auswählen?

edit: Alternativ gibt es noch folgende Möglichkeit:
Du fragst deine Punktzahl ab, und anschließen suchst du alle Datenbankeinträge heraus, die MEHR Punkte haben als du.
Mit mysql_num_rows solltest du dann deinen Rang ermitteln können.

Dann würde ich solange es keine bessere gibt, diese Methode benutzen.
 
Hallo,

Top-10-Liste (pic_id, path nur angenommene Felder):
Code:
SELECT		pic_id,
		path,
		...
FROM		DEINE_TABELLE
ORDER BY	`count` DESC
LIMIT 10

Platzierung eines aufgerufenen Bildes:
Code:
SELECT		COUNT(b.pic_id) AS cnt
FROM		DEINE_TABELLE AS a
JOIN		DEINE_TABELLE AS b
		ON b.`count` > a.`count`
WHERE		a.pic_id = DEINE_PIC_ID

bedenke dabei, dass andere Bilder ebenfalls die gleiche Bewertung haben können wie deines. Du musst dir überlegen, wie Bilder mit gleichem Score in das Ranking einfließen sollen.

COUNT ist ein SQL-Befehl und daher kein guter Spaltenname. Verwende eventuell lieber "score" oder "bewertung". Die Spalte "count" bzw "score" sollte mit einem Index versehen werden.

Grüße
BN
 
Hey BN,

also... ich muss zugeben, dass ich mit JOINS bisher nicht viel zu tun hatte. Kannst du mir deinen Code vielleicht etwas näher erläutern, was du da genau tust?

Und du hast recht, dass ja 2 Bilder die selbe Punktzahl haben können.
Ich denke, dass ich das so regeln werde, dass das gar nicht erst möglich wird, weil ein "neu bewertetes" Bild das Bild sozusagen dann vom Thron stößt (Also Minus 1). Was hältst du von der Idee?

Obwohl... dann müsste ja auch alles dadrunter angepasst werden, wenn wieder die selbe Punktzahl zutrifft...

Da weiß ich jetzt auch nicht so recht wie ich das mache. Vielleicht ja doch ein ganz anderes Punktesystem, denn es sollen keine Platzierungen geteilt werden. Hättest du einen Vorschlag?
 
Hi

lass doch Bilder mit mehr Bewertungen vor Bildern mit weniger Bewertungen (bei gleicher Punktzahl) platzieren.
 
Dann würde ich die absteigend nach Datum sortieren, weil das neuere Bild dann mehr Stimmen bekommen hat (was ja eigentlich besser ist) ;)
 
Ist doch gar nicht so schwer. In MySQL kann man mit Variablen arbeiten, das gibt viele tolle möglichkeiten.

So bekommt man die Rangliste inkl. Rang
SQL:
SELECT
    @rownum:=@rownum+1 AS rang,
    data.*
FROM
    (SELECT @rownum:=0) AS vars,
    (SELECT
	    ui.pic_id,
	    ui.user_id,
	  	SUM(ui.rankingUp-ui.rankingDown) AS ranking
	GROUP BY
		ui.user_id
	ORDER BY 
		ranking
    ) AS data

Und wenn du den Rang eines Users (Bsp User_id = 15) suchst, umfasst du das ganze mit einem weiteren SELECT

SQL:
SELECT 
	master.*
FROM
	(SELECT
	    @rownum:=@rownum+1 AS rang,
	    data.*
	FROM
	    (SELECT @rownum:=0) AS vars,
	    (SELECT
		    ui.pic_id,
		    ui.user_id,
		  	SUM(ui.rankingUp-ui.rankingDown) AS ranking
		GROUP BY
			ui.user_id
		ORDER BY 
			ranking
	    ) AS data) AS master
WHERE
	master.user_id = 15
 
Zuletzt bearbeitet von einem Moderator:
Bevor ich es eräutere... beim ORDER BY habe ich das DESC vergessen....

Das erste leifert in etwa die Rangliste (also die Summe aller Rankings pro User) in der Reihenfolge und der Rangnummer.
Alle Namen mit einem @ davor sind Variablen in MySQL. Mit := kann man ihnen Werte zuweisen.

Das folgende zählt die Rankings zusammen uns sortiert sie
SQL:
SELECT
        ui.pic_id,
        ui.user_id,
        SUM(ui.rankingUp-ui.rankingDown) AS ranking
    GROUP BY
        ui.user_id
    ORDER BY
        ranking DESC

Das 2te Subquery initialisiert die Variablen
SQL:
SELECT @rownum:=0

Diese 2 SQLs werden mit dem Ässeren SELECT combiniert. Dabei wird mit der folgenden Formel bei jedem Datensatz der Rank (oder auch Zeilennummer) um eins vergrössert
SQL:
@rownum:=@rownum+1 AS rang
 
Zuletzt bearbeitet von einem Moderator:
Zurück