2009-08-11 7 views
1

Ich habe heute ziemlich viel Zeit damit verbracht, verschiedene Dinge auszuprobieren, aber keiner von ihnen scheint zu funktionieren. Hier ist meine Situation ist, würde ich in der Lage sein mag den Rang einer Zeile wählen basierend auf seine ID aus einer speziell sortierten ReiheMit MySQL, wie wähle ich Abfrage Ergebnis Rang einer bestimmten Zeile?

Zum Beispiel, wenn meine Frage ist so etwas wie:

SELECT id, name FROM people ORDER BY name ASC 

mit Ergebnissen wie:

 
id name 
3 Andrew 
1 Bob 
5 Joe 
4 John 
2 Steve 

ich möchte den Rang bekommen (was Zeile es in den Ergebnissen endet) ohne alle Zeilen zurückkehrt und sie Looping werfen, bis ich zu dem einen bekomme ich (in PHP) wollen.

Zum Beispiel möchte ich den 'Rang' von 'Steve' auswählen, so dass es zurückkommt - in diesem Fall - 5 (nicht seine ID, sondern der 'Rang' seines Namens in der obigen Abfrage).

In ähnlicher Weise möchte ich in der Lage sein, den Rang einer beliebigen Zeile mit der ID 1 auszuwählen. In diesem Beispiel möchte ich einen 'Rang' von 2 zurückgeben (weil das in der Ergebniszeile steht) ist eine ID von 1) und sonst nichts.

Ich habe google'd so viel wie ich konnte mit unterschiedlichen Ergebnissen ... Entweder mit wirklich langsamen Abfragen für größere Tabellen oder müssen alle Arten von temporären Tabellen und Benutzervariablen erstellen (die ehemalige würde ich wirklich gerne vermeide das letztere, mit dem ich leben kann).

Jede Hilfe oder Einsicht würde sehr geschätzt werden.

Antwort

2

von artfulsoftware:

SELECT p1.id, p1.name, COUNT(p2.name) AS Rank 
    FROM people p1 
    JOIN people p2 
    ON p1.name < p2.name 
    OR (
     p1.name = p2.name 
     AND p1.id = p2.id 
    ) 
GROUP BY p1.id, p1.name 
ORDER BY p1.name DESC , p1.id DESC 
LIMIT 4,1 
+0

bekommen Nach ein paar kleinen Änderungen scheint dies zu funktionieren, ziemlich gut für das, was ich brauche.Aber eine zusätzliche Komplikation: wäre es möglich, eine Reihe von Zeilen mit einer Reihe von Bedingungen zu wählen (zB nur Leute, die ein 'J' im Namen haben - WHERE Name LIKE '% j%'. Ich habe es versucht , und während das Ergebnisfeld 'Rang' immer noch relevant ist, überspringt es Zahlen für diejenigen, die kein J im Namen haben. – theotherlight

2

So ähnlich?

SELECT Row, id, name 
FROM (SELECT @row := @row + 1 AS Row, id, name 
     FROM people 
     ORDER BY name ASC) 
WHERE Row = @SomeRowNumber 

Wenn Sie nach der ID gehen wollen, ändern Sie einfach die Where-Klausel.

+0

Sein gibt Fehler, dass jede abgeleitete Tabelle einen eigenen Alias ​​haben muss @Brandon –

1

Try this:

SELECT @rownum:[email protected]+1 `rank`, p.id, p.name 
FROM people p, (SELECT @rownum:=0) r 
ORDER BY name ASC 
+1

Das ist wie ist das, was ich hatte vorher mit googeln kommen, und es funktioniert super, wenn ich den ‚Rang‘ will jede Zeile innerhalb mein Tisch, aber was, wenn ich nur den Rang einer einzelnen Reihe haben möchte? Ich habe versucht, so etwas wie

 SELECT @rownum:[email protected]+1 'rank', p.id, p.name FROM people p, (SELECT @rownum:=0) r WHERE id = 5 ORDER BY name ASC 
Aber das wird mir immer einen Rang von 1 geben (weil es immer nur ein Ergebnis zurückgibt). Gibt es eine Möglichkeit, den einzelnen Rang einer einzelnen Zeile basierend auf den gesamten Abfrageergebnissen zu erhalten? Ich hoffe, das macht Sinn. – theotherlight

+0

wie man nur einen Datensatz mit diesem bestimmten Rang mit Ihrer Abfrage @Plutor –

0

ich auf diesen Code versuchen ... können andere helfen I Ergebnis von den Benutzern immer bin und Upload-Tabelle für pic Benutzerprofil und schließe dich ihm an, nachdem ich Benutzerpunkte berechnet und sortiert habe. Zuletzt überprüfe und füge Zeilennummer für das Ranking für Benutzer hinzu ... Injoy it. dank

set @row_num = 0; 
set @calp =0; 
select if(@calp=(@calp:=user.cal_points), @row_num, @row_num := @row_num + 1) as row_number,user.* from 
(select user_skills.*,users.username,upload.file_name from user_skills join users on user_skills.user_id=users.id join upload on upload.upload_id=users.profile_pic order by user_skills.cal_points desc) as user 
WHERE user.skill_name LIKE '%ph%'