Suchbefehl in MySql + Zielennummer

Zhoragh

Mitglied
Weis jemand wie ich follgendes Realisieren kann.

Ich möchte ein Suchanfrage an eine MySql datenbank schicken als ergebniss möchte ich gern die Zeilenzahl des Ergebniss haben. Dabei sortier ich die Daten nach einer der Spalten.

Beispiel

Tabelle
NAME ZAHL ID
A 12 1
B 8 2
C 11 3

jetzt such ich nach B und sortiere nach Zahl abwärts rauskommen sollte dann Zeile 3

Wie bekomme ich das hin? gibt es einen Spezielen Befehl der die Zeile ausgibt?
 
Hi, in SQL gibts dafür die RANK() OVER Funktion, aber ich glaube MySQL kann das nicht. Ein Workaround wäre dieser:

PHP:
//connect and select DB
mysql_query("SET @rank=0;");
$result = mysql_query("SELECT * FROM 
                         (SELECT @rank:=@rank+1 AS rank, id, name, zahl
                            FROM <Tabelle> ORDER BY zahl DESC) 
                          AS temp 
                         WHERE name='<Suchwert>';");

while ($row = mysql_fetch_array($result)) { echo "<pre>"; print_r($row); echo "</pre>"; }

<Tabelle> und <Suchwert> dann noch entsprechend ersetzen ;)

Mir fällt grad auf: Wenn deine Tabelle seeehhr groß ist, ist das natürlich nicht so performant, weil intern erst die ganze Tabelle (mit Rank) aufgebaut wird und danach erst die richtige Zeile rausgefiltert wird.
 
Zuletzt bearbeitet:
Leider löst das nicht mein Problem.

Hier noch mal konkret mein Problem:

Ich habe eine Tabelle mit 3 Spalten ID, NAME, WERT
Bei der Ausgabe in PHP wird die Tabelle bei der Abfrage nach der Spalte WERT sortiert und nur ein Bereich aus der Tabelle über LIMIT aufgerufen.

wenn ich jetzt eine neue Zeile in die Tabelle einfüge weis ich nicht an welcher stelle es nach der sortierung ist.
Konkret ich will wissen wie ich die Parameter von LIMIT setzen muss damit meine neu eingefügte Zeile unter den Resultdaten ist unter berücksichtigung das die Zeilen nach der Spalte WERT sortiert werden bei der Abfrage.

dazu kommt das es eine recht große Tabelle ist und ich nicht die ganzen Daten auslesen kann und dann in Php nach den Wert suchen kann.

ich will also so was wie follgende Abfrage :

"suche nach LAST_ID -> gib mir die Zeile in der es in der Tabelle liegt -> Ordne vorher nach WERT"
 
Tut mir leid, aber ich verstehs nicht. Kannst du mal ein ausführliches Beispiel mit Zahlen machen. Im ersten Post hast du zum Beispiel gar nichts von LIMT erwähnt.
Und vielleicht hilft es auch, wenn du sagst, was das für einen Sinn macht. Also was willst du damit erreichen? Was für Werte stehen in der Tabelle? Irgendwelche Messwerte?
 
Ich habe bisher (was nicht viel zu sagen hat) noch nicht rausgefunden wie man von einer Abfrage die Zeilennummer rausbekommen kann.
Ich sehe allerdings auch keinen Sinn darin... Was genau willst du mit der Zeilennummer anfangen?
 
also wenn ich das verstanden habe, möchte er aus einer tabelle eine zeile auslesen,
diese wird nach einer spalte sortiert und er möchte wissen die wievielte Zeile es ist, sprich wieviele Zeilen noch davor sind bzw die wievielte Zeile die gesuchte Zeile nach der Sortierung ist und dass alles mit einem LIMIT 1..

PHP:
$data   = mysql_fetch_array(mysql_query("SELECT zahl FROM tabelle WHERE name='B' LIMIT 1"));
$data1 = mysql_num_rows(mysql_query("SELECT id FROM tabelle WHERE zahl>='".$data['zahl']."' ORDER BY zahl DESC"));

Dass würde mir spontan einfallen, jedoch ist dies nicht mit nem limit.. gibt sicher noch elegantere und schönere Lösungen ;)
 
Zuletzt bearbeitet:
Folgende Queries geben jeweils die Anzahl der vorher auftretenden Elemente zurück - Ich hofe mal, dass es selbsterklärend ist. Fehler sind nicht ausgeschlossen, habe es nur runtergetippt und nicht getestet.

Für Zahlenwerte:
SQL:
SELECT COUNT( * )
FROM (
    SELECT 1
    FROM `table` AS `t`
    WHERE `t`.`wert` <= (
         SELECT `t2`.`wert`
         FROM `table` AS `t2`
         WHERE `t2`.`id` = LAST_INSERT_ID()
         )
    ORDER BY NULL
    ) AS `temp`
);

Für Strings:
SQL:
SELECT COUNT( * )
FROM (
    SELECT 1
    FROM `table` AS `t`
    WHERE STRCMP( `t`.`wert`, (
         SELECT `t2`.`wert`
         FROM `table` AS `t2`
         WHERE `t2`.`id` = LAST_INSERT_ID()
         ) ) IN ( -1, 0 )
    ORDER BY NULL
    ) AS `temp`
);
 
Zurück