MySQL_select: Wievielte row nach OrderBy

Mark

Cinema4D
Hallo Ihr Lieben!

Ich brauche Eure Hilfe:
Habe eine Tabelle mit nicht fortlaufenden IDs (Primary Key). Möchte nun eine Row über die ID abrufen (select * from table where id=n) und dabei aber auch gleich wissen, die wievielte Row das ist (unter Berücksichtigung von "order by").

Konkretes Problem: habe eine Liste von "Seiten-Zahlen" wie hier im Forum: Seite eins zeigt Beiträge 1-10, Seite zwei 11-20 usw. Wie geschrieben, diese "Nummerierung" gehorcht "Limit" (und order by) und ist unabhängig der ID. Wenn nun sozusagen ein "Thema" "selektiert" wird, möchte ich auch gleich auf die richtige "Seiten-Zahl" springen, brauche also die "row"...
...klingt das zu Wirr?! ;)

Wusste nicht wonach ich suchen soll, so gesehen wäre mir mit Zielführenden Keywords bereits geholfen :)
Ich hoffe, es liegt ansonsten nicht nur am Wetter bzw. am Pudding im Hirn... :)

Vielen Dank schoneinmal für Eure Mühe,
Liebe Grüße,
Mark.
 
Abgeleitet aus meinen Beiträgen zur Rangermittlung, hier ein kleines Beispiel mit Subselect (Achtung ab Version 4.1):
Code:
SELECT
  t1.Feld1,
  t1.Feld2,
  ...,
  t1.Sortierfeld,
  (SELECT (COUNT(*) + 1)
    FROM Tabelle AS t2
    WHERE t1.Sortierfeld>t2.Sortierfeld)
  AS Zeile
FROM Tabelle AS t1
ORDER BY Sortierfeld
Eine Where-Klausel kannst Du nun nach belieben hinzufügen.

Gruß hpvw
 
Hi hpvw!

Danke für die wirklich schnelle Antwort! :)
Gleichzeitig merkt man, daß ich nicht "vom Fach" bin, sonst hätte ich Dir meine verfügbare Version nicht vorenthalten: 4.0.20 ...ich Dödel, ich :(

Somit nochmal nachgehakt: mit 4.0 auch lösbar? ;)
Oder alternativ: würde es die Anfrage "vereinfachen", wenn ich "nur" die "row"-Nummer, nicht die restlichen Werte der row abfragen würde?
Bzw. worst case: geht es zumindest eleganter, als: alle rows sortiert abzufragen und mittels Perl die rows bis zur gesuchten "durchzuzählen"?

Liebe Grüße,
Mark.
 
Vielleicht mit dem LEFT JOIN Workaround:
Code:
SELECT
  t1.Feld1,
  t1.Feld2,
  ...,
  t1.Sortierfeld,
  (COUNT(t2.Sortierfeld) + 1) AS Zeile
FROM Tabelle AS t1
LEFT JOIN Tabelle AS t2
  ON t1.Sortierfeld > t2.Sortierfeld
GROUP BY t1.PrimaryKey # <- vermutl. t1.id
ORDER BY t1.Sortierfeld
Oder Du nimmst das innere Query heraus und führst es anschließend getrennt aus, um diesen einen Wert zu erhalten (t1.Sortierfeld durch den entsprechenden Wert ersetzen).

Gruß hpvw
 
Was mir noch einfällt:
Du solltest als letzte Alternative ein eindeutiges Kriterium zum Sortieren definieren (z.B. die ID). Da MySQL nach dem Sortierkriterium gleiche Einträge in eine undefinierte Reihenfolge bringt, während die beiden von mir geposteten Abfragen für nach dem Sortierkriterium gleichwertige Zeilen auch den gleichen Wert zurückgibt. Das kannst Du auch grob in dem Rangermittlungs-Thread nachlesen.
Ich nehme jetzt einfach mal an, Dein Primärschlüssel heißt ID:
Code:
SELECT
  t1.Feld1,
  t1.Feld2,
  ...,
  t1.Sortierfeld,
  (COUNT(t2.Sortierfeld) + 1) AS Zeile
FROM Tabelle AS t1
LEFT JOIN Tabelle AS t2
  ON (t1.Sortierfeld > t2.Sortierfeld 
    OR (t1.Sortierfeld = t2.Sortierfeld AND t1.id > t2.id))
GROUP BY t1.id
ORDER BY t1.Sortierfeld, t1.id
Gruß hpvw
 
Hi hpvw!

Ich bin hin und weg! :)
Wäre ich auch ohne Pudding im Hirn nie drauf gekommen (der Ansatz, alle "vorhergehenden" rows per Left Join anzuhängen und zu counten ist ja sooo faszinierend) :)

You made my day! :)

Nochmals vielen, vielen Dank!
Liebe Grüße,
Mark.
 
Bevor Du mir irgendeine Form von Genialität anlastest muss ich fairerweise sagen, dass die Idee (für ein etwas anderes Problem) von Tom kommt.

Gruß hpvw
 
Zurück