Mit der folgenden MySQL-Tabelle:
+-----------------------------+
+ id INT UNSIGNED +
+ name VARCHAR(100) +
+-----------------------------+
Wie kann ich eine wählen einzelne Zeile und seine Position unter den anderen Zeilen in der Tabelle, wenn nach sortiert name ASC
. Wenn die Tabellendaten also so aussehen, wenn sie nach Namen sortiert sind:
+-----------------------------+
+ id | name +
+-----------------------------+
+ 5 | Alpha +
+ 7 | Beta +
+ 3 | Delta +
+ ..... +
+ 1 | Zed +
+-----------------------------+
Wie kann ich die Beta
Zeile auswählen, die die aktuelle Position dieser Zeile erhält? Die Ergebnismenge, nach der ich suche, wäre ungefähr so:
+-----------------------------+
+ id | position | name +
+-----------------------------+
+ 7 | 2 | Beta +
+-----------------------------+
Ich kann einfach SELECT * FROM tbl ORDER BY name ASC
die Zeilen in PHP aufzählen, aber es scheint verschwenderisch, eine potenziell große Ergebnismenge nur für eine einzelne Zeile zu laden.
sql
mysql
analytic-functions
Leepowers
quelle
quelle
Antworten:
Benutze das:
... um einen eindeutigen Positionswert zu erhalten. Dies:
... gibt Krawatten den gleichen Wert. IE: Wenn es zwei Werte an zweiter Stelle gibt, haben beide eine Position von 2, wenn die erste Abfrage einem von ihnen eine Position von 2 und dem anderen eine Position von 3 gibt ...
quelle
position
, aber es ist perfekt.Dies ist der einzige Weg, den ich mir vorstellen kann:
quelle
name <= 'Beta'
stattdessen verwendenposition
Werte für Bindungen.LIMIT 1
? Im Falle eines Unentschieden erhalten Sie nur eine Reihe mit der letzten Position des Unentschieden.name
Feld eindeutig ist, gibt es keinen Grund, die Abfrage komplexer zu gestalten. Wenn er nicht kann - dann warten wir auf seine Ergebniserwartungen für gebundene Namen.Wenn die Abfrage einfach ist und die Größe der zurückgegebenen Ergebnismenge möglicherweise groß ist, können Sie versuchen, sie in zwei Abfragen aufzuteilen.
Die erste Abfrage mit einem eingegrenzten Filterkriterium, nur um Daten dieser Zeile abzurufen, und die zweite Abfrage verwendet die Klausel
COUNT
withWHERE
, um die Position zu berechnen.Zum Beispiel in Ihrem Fall
Abfrage 1:
SELECT * FROM tbl WHERE name = 'Beta'
Abfrage 2:
SELECT COUNT(1) FROM tbl WHERE name >= 'Beta'
Wir verwenden diesen Ansatz in einer Tabelle mit 2 Millionen Datensätzen und dies ist weitaus skalierbarer als der Ansatz von OMG Ponies.
quelle
Die anderen Antworten scheinen mir zu kompliziert.
Hier ein einfaches Beispiel : Angenommen, Sie haben eine Tabelle mit Spalten:
und Sie möchten die Benutzer-IDs nach Punkten sortieren und die Zeilenposition (das "Ranking" des Benutzers) erhalten, dann verwenden Sie:
num
gibt Ihnen die Zeilenposition (Rangfolge).Wenn Sie MySQL 8.0+ haben, möchten Sie möglicherweise ROW_NUMBER () verwenden.
quelle
Die Position einer Zeile in der Tabelle gibt an, wie viele Zeilen "besser" sind als die Zielzeile.
Sie müssen diese Zeilen also zählen.
SELECT COUNT (*) + 1 FROM
table
WHEREname
<'Beta'Bei einem Unentschieden wird die höchste Position zurückgegeben.
Wenn Sie nach der vorhandenen Zeile "Beta" eine weitere Zeile mit dem gleichen Namen "Beta" hinzufügen, ist die zurückgegebene Position immer noch 2, da sie denselben Platz in der Klassifizierung haben.
Ich hoffe, dies hilft Menschen, die in Zukunft nach etwas Ähnlichem suchen werden, da ich glaube, dass der Frageninhaber sein Problem bereits gelöst hat.
quelle
Ich habe ein sehr sehr ähnliches Problem, deshalb werde ich nicht die gleiche Frage stellen, aber ich werde hier mitteilen, was ich getan habe. Ich musste auch eine Gruppe von verwenden und von AVG bestellen. Es gibt Studenten mit Unterschriften und Socore, und ich musste sie bewerten (mit anderen Worten, ich berechnete zuerst die AVG, bestellte sie dann in DESC und schließlich musste ich die Position hinzufügen (Rang für mich), also tat ich es etwas sehr ähnliches wie die beste Antwort hier, mit ein paar Änderungen, die sich an mein Problem anpassen):
Ich habe schließlich die
position
Spalte (Rang für mich) in das externe SELECT eingefügtquelle
Ich habe die akzeptierte Antwort durchgesehen und sie schien etwas kompliziert zu sein. Hier ist die vereinfachte Version davon.
quelle
Ich habe ähnliche Arten von Problemen, bei denen ich den Rang ( Index ) der Tabelle benötige
order by votes desc
. Das Folgende funktioniert gut für mich.quelle
Möglicherweise benötigen Sie eine Add-Syntax
also benutze
wenn Sie nur eine Reihe brauchen ..
quelle