2017-05-25 1 views
1

Ich habe die folgende mysql-Anweisung, um Top 10 Benutzerdaten plus die Daten für den angemeldeten Benutzer zurück zu holen (wenn der angemeldete Benutzer in den Top 10 ist, gibt es nur 10 Ergebnisse insgesamt, sonst gibt es 11) ...MySQL-User-Rang mit sortierten Ergebnissen

(SELECT user_id, points, amountLikes, amountComments 
FROM all_scores_table 
ORDER BY points desc, amountLikes desc, amountComments desc 
LIMIT 0,10) 

UNION 

(SELECT user_id, points, amountLikes, amountComments 
FROM all_scores_table 
WHERE user_id = $session_user_id) 

ORDER BY points desc, amountLikes desc, amountComments desc 

Die all_scores_table hat genau 1 Zeile pro Benutzer. Ich versuche nun, der zweiten Abfrage Ranginformationen hinzuzufügen (z. B. wenn es 11 Zeilen gibt, möchte ich wissen, ob die Sitzungsbenutzer-ID 11 oder 468 in der Liste ist).

Ich habe eine Reihe von ähnlichen Posts gelesen, konnte aber keine Antwort finden, die für die Art und Weise, wie ich meine erste Anfrage geschrieben habe, zu gelten schien, indem geordnete Ergebnisse - z. Ich kann nicht einfach eine einfache Anzahl von Zeilen mit Punkten hinzufügen, die größer sind als mein Benutzer, denn wenn sie gerade sind, möchte ich auf mengeLikes, mengeComments verweisen, um die wahre Reihenfolge zu finden.

Ich könnte natürlich tun dies in PHP mit einer zweiten Abfrage, aber ich hoffe, dass jemand eine elegante Art und Weise bemerkt dies

Antwort

1

allein in mysql erzielen würde ich nicht versuchen empfehlen klug zu sein und eine Abfrage verwenden. Erstellen Sie stattdessen zwei Abfragen, von denen die eine die zehn besten findet und die andere den angemeldeten Benutzer zusammen mit seinem numerischen Rang findet. Für die erste Abfrage, können Sie, was Sie bereits haben:

SELECT 
    user_id, points, amountLikes, amountComments 
FROM all_scores_table 
ORDER BY points DESC, amountLikes DESC, amountComments DESC 
LIMIT 10 

Wie für die Zuweisung von Rängen, können Sie einfach diese in Ihrem PHP-Code behandeln, wenn Sie über die Ergebnismenge iterieren. Verwenden Sie einfach einen variablen Zähler beginnend bei 1.

Um den Rang des derzeit angemeldeten Benutzers zu erhalten, wird es mehr Arbeit erfordern, weil er in der Mitte von Hunderten (oder mehr) von Datensätzen begraben werden konnte. Eine Möglichkeit ist, Session-Variablen verwenden:

SET @row_number = 0; 

SELECT 
    (@row_number:[email protected]_number + 1) AS rank, 
    user_id, points, amountLikes, amountComments 
FROM all_scores_table 
WHERE user_id = $session_user_id 
ORDER BY points DESC, amountLikes DESC, amountComments DESC 

Diese zweite Abfrage soll einen einzelnen Datensatz zurückgeben (vorausgesetzt, jeden Benutzer wird nur einmal), mit dem Metadaten, die Sie zusammen mit einem numerischen Rang benötigen.

In Ihrer PHP-Logik können Sie überprüfen, ob der Rang in den Top Ten ist, und wenn dies der Fall ist, zeigen Sie diesen zusätzlichen Einzeldatensatz nicht am Ende Ihrer Tabelle an.

+0

Danke Tim, aber ich verstehe nicht, wie dies Rank-Informationen zurückgibt - es gibt keine zusätzlichen Spalten also wie würde ich wissen, ob der Benutzer 11. oder 468. war? – d3wannabe

+0

@ d3wannabe Ich habe meine Antwort aktualisiert. Ich empfehle, mit Ihrer ersten Top-Ten-Abfrage zu bleiben, Ränge in Ihrem PHP-Code zuzuweisen und dann Sitzungsvariablen zu verwenden, um den Rang des aktuell angemeldeten Benutzers zu erhalten. –

Verwandte Themen