Das zweite Maximum auswählen?

Okay, danke. Ich hab es jetzt so übernommen:

PHP:
$query = mysql_query("SELECT
    @rownum:=@rownum+1 AS rang,
    DATA.*
FROM
    (SELECT @rownum:=0) AS vars,
    (SELECT
        `user_id`.`id`,
        `user_id`.`user_id`,
        SUM(`user_id`.`rankingUp`-`user_id`.`rankingDown`) AS ranking
    GROUP BY
        `user_id`.user_id
    ORDER BY
        ranking DESC
    ) AS DATA
	");
echo mysql_error();
#$query = mysql_query("SELECT `user_id` FROM `users_img` ORDER BY `score` DESC LIMIT 10");
$i=1;
while ($img = mysql_fetch_array($query)) {
echo "<a href='?s=user&id=".$img['user_id']."'>
<img class='border' height='220' width='210' src='users/".$img['user_id']."/user.jpg' alt='' title='Platz #".$i."' /></a>";

und bekomme folgenden Fehler:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY `user_id`.user_id ORDER BY ranking DESC ) A' at line 10
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given ...
 
Hallo,

scheinbar seid ihr schon weiter gekommen.

zu deinem aktuellen Problem:
`user_id`.user_id => diese Notation bedeutet dass du auf die Tabelle "user_id" und das Feld "user_id " zugreifen möchtest. ich schätze mal, dass du eine Tabelle Namens "user_id" nicht haben wirst.

Weiterhin fehlt mir bei der Abfrage eine Tabelle, die abgefragt wird. Versuche es vlt. mal so (ich hoffe die Tabelle mit den Bildern heißt user_img):
SQL:
SELECT	@rownum:=@rownum+1 AS rang,
		DATA.*
FROM 	(SELECT @rownum:=0) AS vars,
		(
			SELECT		id,
						user_id,
						SUM(rankingUp-rankingDown) AS ranking
			FROM		user_img
			GROUP BY	user_id
			ORDER BY	ranking DESC
    	) AS DATA
LIMIT	15

Nachtrag:
Das Arbeiten mit SQL-Variablen ist fortgeschrittenes Niveau. Meiner Meinung nach sollte man nur "Dinge" verwenden, die man auch versteht. Die Ausgabe des Rankings ist ohne Probleme auch ohne SQL-Variablen möglich. Nichts desto trotz ist der von yaslaw gepostete Query natürlich eine ausgezeichnete Lösung ;-).

Grüße BN
 
Zuletzt bearbeitet von einem Moderator:
Vielen vielen Dank für die Antwort! Das hat mir geholfen. Ich stell mich wohl auch teilweise blöd an.

Ich hätte mal eine SQL-relevante Frage und will nicht extra einen Thread wieder dafür aufmachen.
Also, ist es in Ordnung, wenn ich mit...

PHP:
$count = mysql_num_rows(mysql_query("
SELECT `id` FROM `tab` WHERE blabla='0'
"));
if (empty($count)) ...

überprüfe, ob ein bestimmer Eintrag schon vorhanden ist oder nicht? Also, mache ich das "am Besten" bzw. am effizientesten mit mysql_num_rows? Es gibt ja noch mysql_fetch_array und dann kann man COUNT(`id`) schreiben. Tut man das nur, wenn man sich eine extra Abfrage sparen möchte, wo man z.B. nur mysql_num_rows benutzt?


Und jetzt hab ich noch Schwierigkeiten den zweiten SQL Code von yaslaw anzuwenden, wo man nur von einem User das Ranking erfährt. Eine Frage hab ich dazu gleich noch... brauch ich noch die "score"-Spalte? Eigentlich nicht, oder?
 
Hallo lisali,

es gibt verschiedenste Möglichkeiten, die Existenz eines Wertes abzufragen.

1. Eine einfache Existenzprüfung:
PHP:
$res = mysql_query ("SELECT 1 FROM tab WHERE blabla='0'");
list ($recordExists) = mysql_fetch_row ($res);

2.a Für eine genaue Anzahl an DS, die existieren:
PHP:
$res = mysql_query ("SELECT COUNT(*) FROM tab WHERE blabla='0'");
list ($anzRecords) = mysql_fetch_row ($res);

2.b Für eine genaue Anzahl an DS, die existieren:
PHP:
$res = mysql_query ("SELECT blabla FROM tab WHERE blabla='0'");
$anzRecords = mysql_num_rows ($res);

Welche du davon verwendest, ist ganz allein dem jeweiligen Fall bzw. dir überlassen. Ich bevorzuge Variante 1 bzw. 2.a.

Bezüglich deiner zweiten Frage - es macht durchaus Sinn, den Score als Spalte zu führen. Datenbanken haben den Vorteil, dass sie unter bestimmten Bedingungen sehr sehr schnell sind. Eine der Bedingungen ist das Setzen gescheiter Indexe auf Spalten. Auf eine Rechenoperation kann kein Index gesetzt werden. Daher wäre es von Vorteil, das errechnete Ergebnis (score) als extra Spalte zu führen und auf diese Spalte (abhängig von der Abfrage auch weitere Spalten als zusammen gesetzter Index) einen Index zu setzen.

Wie optimal oder auch suboptimal ein Query ausgeführt wird, kann du dir ansehen, wenn du vor den Query das Zauberwort EXPLAIN schreibst:
SQL:
EXPLAIN SELECT a.spalte FROM tabelle AS a JOIN tabelle2 AS b ON a.spalte = b.spalte
Ich schätze jedoch, dass dieses Thema derzeit für dich noch nicht relevant sein wird, da sich hier nur Fragezeichen auftun werden. Merke dir einfach für einen späteren Zeitpunkt, das ein Query optimiert werden kann, sofern die Bedingungen dafür gegeben sind (score Spalte).

Kannst du deine Unklarheit bzgl. der Ranking-Abfrage etwas präzisieren?

Grüße BN
 
Zuletzt bearbeitet von einem Moderator:
Okay, vielen Dank. Den Thread hier muss ich wohl in meinen Favouriten speichern.

Mir geht es ja eigentlich nur darum, dass ich nicht irgendeinen SQL-Befehl zwar benutze, dass er funktioniert, aber es wie gesagt eben effizientere oder eben leistungsoptimiertere Lösungen gäbe. Und wenn ich dann dauernd das selbe machen würde, müsste ich mir ja irgendwann die Arbeit machen alles zu optimieren und umzuändern.

Okay, das mit `score` hat mich jetzt nur verwundert, weil es gar nicht im SQL-Statement verwendet wird... deswegen denke ich, dass das eigentlich rausgenommen werden kann!? Oder sollte ich es einfach mit dieser SQL-Rechenoperation (ratingUp - ratingDown) ersetzen?

Wegen der Unklarheit: Es geht um den Code von y. :

Code:
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

Er meinte, dass das den Rang eines einzelnen Users anzeigt. Aber dort ist zum Beispiel auch gar keine Tabelle angegeben. Mein Tabellenname heißt ja users_img.
 
Hab ich doch in der Mitte voll ein FROM vergessen
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
-- Hier den Teil den ich vergessen habe
        FROM
            users_img
-- Ende Einschub
        GROUP BY
            ui.user_id
        ORDER BY
            ranking
        ) AS DATA) AS master
WHERE
    master.user_id = 15
 
Zuletzt bearbeitet von einem Moderator:
Ergänzend zum Query noch meine Empfehlung, lege die Spalte "score" an, berechne mit jedem Voting den resultierenden "score" und schreibe ihn weg. Die Berechnung (rankingUp-rankingDown) kannst du dann durch die Spalte "score" ersetzen.
 
Ergänzend zum Query noch meine Empfehlung, lege die Spalte "score" an, berechne mit jedem Voting den resultierenden "score" und schreibe ihn weg. Die Berechnung (rankingUp-rankingDown) kannst du dann durch die Spalte "score" ersetzen.

Aber es wäre nicht empfehlenswert, wenn ich die Anzahl an positiven und negativen Bewertungen ausgeben möchte, oder?
Ich überlege nämlich gerade, ob ich es mache oder nicht, da das vielleicht von Interesse für den Besucher ist.

Also, ich hab jetzt das SQL-Statement jetzt so übernommen, aber der zeigt mir eigentlich "nur" das selbe wie die Spalte `score` an. Also die Differenz der Bewertungen.

PHP:
$query = mysql_fetch_array(mysql_query("
SELECT master.* FROM
    (SELECT @rownum:=@rownum+1 AS rang, DATA.*
    FROM (SELECT @rownum:=0) AS vars, (SELECT id, user_id, SUM(ratingUp-ratingDown) AS ranking 
	FROM `users_img` GROUP BY `user_id` ORDER BY ranking) AS DATA) AS master
	WHERE master.user_id = ".$_GET['id']."
	"));
echo mysql_error();

echo $query[ranking];

Ich glaube hier ist übrigens auch das mysql_fetch_array überflüssig, wenn ich nur eine Ausgabe machen möchte, oder?
 
Ich habe noch schnell eine Frage zum ersten "großen" SQL-Statement, wo die Rangliste mit LIMIT angezeigt wird.

Ist es "schlecht", wenn ich stattdessen einfach nur

PHP:
$query = mysql_query("SELECT `user_id` FROM `users_img` ORDER BY `ranking` DESC LIMIT 10");

benutze?
 
Also, ich habe es jetzt rausgefunden, dass die SQL-Variable "ranking" ja für das andere zuständig ist und nicht für die Platzierung selbst.

Jetzt habe ich die rang-Variable benutzt, aber das scheint irgendwie nicht zu stimmen. Also, soweit ich das getestet habe ist die Rangliste nämlich genau umgekehrt. Der erste Platz ist der letzte und umgekehrt...

Edit:

Ahh... es hat ein DESC gefehlt..


Wobei benutzt man eigentlich vorzugsweise mysql_fetch_assoc?
 
Zuletzt bearbeitet:
Zurück