Cruz: mysql, Zeilenindex mit selecten

Hallo Leute,

kennt jemand eine Methode, um den Zeilenindex zu jedem Ergebnisdatensatz in einem SELECT rauszukriegen? Am liebsten würde ich den Zeilenindex mit selecten, finde aber keine Möglichkeit in der mysql Referenz. So sollte das Ergebnis eines Selects aussehen:

+-------+----+
| index | id |
+-------+----+
|     1 | 14 |
|     2 | 15 |
|     3 | 16 |
+-------+----+

Bei DBI könnte man natürlich auch ansätzen und z.B. in einer while(fetchrow()) Schleife einen Index hochzählen, diese Methode setze ich allerdings höchst selten ein, daher ist das keine Lösung.
Oder soll ich nachträglich über rows() die Anzahl ermitteln und rückwirkend die Zeilenindizes in einen arrayref reinhacken? Ich weiss nicht.

Würde mich ueber Ideen freuen.

Gruß,
Cruz

  1. Halihallo Cruz

    Würde mich ueber Ideen freuen.

    Nun, jede Idee (und die gibt es) ist grober unfug. Wozu brauchst du diese durch
    sequentielles Auslesen implizite Information?

    Viele Grüsse

    Philipp

    1. Moin Moin !

      Nun, jede Idee (und die gibt es) ist grober unfug. Wozu brauchst du diese durch
      sequentielles Auslesen implizite Information?

      Ihm sind push, pop, shift und unshift nicht geläufig?

      Alexander

      --
      Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
      1. Halihallo Alexander

        Nun, jede Idee (und die gibt es) ist grober unfug. Wozu brauchst du diese durch
        sequentielles Auslesen implizite Information?

        Ihm sind push, pop, shift und unshift nicht geläufig?

        Es macht den Anschein ;)
        wobei ich anfügen muss, dass die Ergebnismenge zumindest in Perl sequentiell (also der
        Reihe nach) ausgelesen werden, ein Speichern aller Daten in einem Array ist nicht ratsam.

        @Cruz: Was hast du _wirklich_ vor? - Wozu brauchst du diese Information?

        Deine Idee mit while ist schonmal gut. Die Indizies bekommst du dadurch implizit (einfach
        hochzählen). Wobei du wohl aus der Ergebnismenge eine spezielle Information extrahieren
        möchtest und _diese_ spezielle Information sollte, wenn möglich, bereits in den Query
        eingebunden werden (deinen Informationen zur Folge würde ich dir zu LIMIT raten, kann
        jedoch, wenn du uns mehr Informationen lieferst, noch verbessert werden).

        Viele Grüsse

        Philipp

        1. Na ihr zwei,

          ihr seid mir zwei Pfeifen, das hat doch mit push und pop nicht im Entferntesten was zu tun und der sequenzielle Auslesen Spruch greift hier auch nicht wirklich. Ich will wissen, dass wenn ich einen komplexen SELECT mit diversen Bedingungen + Sortierung in die Datenbank absetze an welcher Stelle ein Datensatz mit der id X steht. Die fetchall_arrayref() DBI Funktion liefert ein array von hashrefs zurück, welches man wunderbar als Objekt zur weiteren Verarbeitung verwenden kann. Um die Position eines Datensatzes herauszufinden müsste ich das array durchnudeln und mitzählen, bis ich weiss wo mein Datensatz steht. Wenn der Positionsindex gleich im Objekt mit drin ist, dann kennt jeder Datensatz seinen eigenen Positionsindex und dann braucht man es nur noch abzurufen.
          Mit LIMIT kann man übrigens nur den tatsächlich ausgegebenen Wertebreich nur einschränken, aber nicht ausgeben.

          Gruß,
          Cruz

          1. Moin Moin !

            Bischen umständlich, oder?

            Warum schreibst Du nicht einfach das/die WHERE-Statement(s) so, daß nur ein Datensatz zurückkommt?

            Willst Du das vielleicht in einer Webserver-Umgebung (CGI & friends) benutzen? Dann warte mal ab, bis jemand ein INSERT, DELETE oder UPDATE macht, daß Dir die Positionen durcheinanderbringt.

            Und übrigens, *DU* Pfeife, wenn Du Dein Problem gleich sauber beschrieben hättest, wäre die Nachfrage unnötig gewesen.

            Alexander

            --
            Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
          2. Halihallo Cruz

            ihr seid mir zwei Pfeifen, das hat doch mit push und pop nicht im Entferntesten was zu tun und der sequenzielle Auslesen Spruch greift hier auch nicht wirklich.

            Entweder du hast uns relevante Informationen vorenthalten, oder du verstehst unseren
            Lösungsvorschlag nicht.

            Ich will wissen, dass wenn ich einen komplexen SELECT mit diversen Bedingungen + Sortierung in die Datenbank absetze an welcher Stelle ein Datensatz mit der id X steht.

            Dir ist die Methode selectcol_arrayref bekannt?

            <quote>
              # get array of id and name pairs:
              my $ary_ref = $dbh->selectcol_arrayref("select id, name from table", { Columns=>[1,2] });
              my %hash = @$ary_ref; # build hash from key-value pairs so $hash{$id} => name
            </quote>

            Dann kannst du über den %hash nach ID selektieren. Problem: Du kannst nur zwei
            Columns selektieren.

            Die fetchall_arrayref() DBI Funktion liefert ein array von hashrefs zurück, welches man wunderbar als Objekt zur weiteren Verarbeitung verwenden kann. Um die Position eines Datensatzes herauszufinden müsste ich das array durchnudeln und mitzählen, bis ich weiss wo mein Datensatz steht. Wenn der Positionsindex gleich im Objekt mit drin ist, dann kennt jeder Datensatz seinen eigenen Positionsindex und dann braucht man es nur noch abzurufen.

            Ein Array hat den Positionsindex immer implizit. $array_ref->[$index]. Aber wenn du
            die _ID_ finden möchtest, müsstest du wirklich durch den ArrayRef iterieren bzw.
            obengenannte Möglichkeit umsetzen, oder durch das genannte LIMIT oder geeignete
            Kriterien in der WHERE-Klausel selektieren.

            Mit LIMIT kann man übrigens nur den tatsächlich ausgegebenen Wertebreich nur einschränken, aber nicht ausgeben.

            Hä? - Was anderes ist nicht die Aufgabe von LIMIT.

            Viele Grüsse

            Philipp