Jana: MySQL 5.1 -automatisch nummerieren pro Typ

Hi

wie kann ich in MySQL 5.1 anhand festgelegter Regeln, für diese Regel automatisch die Datensätze nummerieren lassen?

Beispiel (Rohdaten)
+----+------+------+
| id | type | Text |
+----+------+------+
| 1  | 1    | abc  |
| 2  | 2    | bcd  |
| 3  | 1    | cde  |
| 4  | 1    | def  |
| 5  | 2    | efg  |
| 6  | 1    | fgh  |
| 7  | 2    | ghi  |
+----+------+------+

Bei dem View soll für jeden Typ von 1 an fortlaufend durchnummeriert werden.
Das soll nachher rauskommen:
+----+------+------+---------+
| id | type | Text | counter |
+----+------+------+---------+
| 1  | 1    | abc  | 1       |
| 2  | 2    | bcd  | 1       |
| 3  | 1    | cde  | 2       |
| 4  | 1    | def  | 3       |
| 5  | 2    | efg  | 2       |
| 6  | 1    | fgh  | 4       |
| 7  | 2    | ghi  | 3       |
+----+------+------+---------+

Ich habe folgendes gefunden:
Datensätze im MySQL-Query nummerieren lassen und nicht durch PHP
Das bringt mich nicht richtig weiter, da damit der Counter über alle Datensätze geht.

Jana

  1. Hello,

    wie kann ich in MySQL 5.1 anhand festgelegter Regeln, für diese Regel automatisch die Datensätze nummerieren lassen?

    Das geht mit benutzerdefinierten Variablen.

    Frag mich aber bitte nicht, wo man die im Handbuch findet...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      wie kann ich in MySQL 5.1 anhand festgelegter Regeln, für diese Regel automatisch die Datensätze nummerieren lassen?

      Das geht mit benutzerdefinierten Variablen.

      Frag mich aber bitte nicht, wo man die im Handbuch findet...

      Über die Suche im MySQL-Handbuch finde ich nie, was ich brauche.
      Aber Google gibts ja auch noch:
      http://dev.mysql.com/doc/refman/5.1/de/user-variables.html

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. Tach!

    wie kann ich in MySQL 5.1 anhand festgelegter Regeln, für diese Regel automatisch die Datensätze nummerieren lassen?

    Wie lauten diese Regeln genau und was sind die Rahmenbedingungen? Wann soll nummeriert werden? Einmalig den vorhandenen Datenbestand, bei jedem Abfragen, anders?

    Bei dem View soll für jeden Typ von 1 an fortlaufend durchnummeriert werden.

    Ist die Anzahl der Typen auf 2 oder eine andere kleine Anzahl begrenzt oder können da beliebig viele Werte auftreten?

    Datensätze im MySQL-Query nummerieren lassen und nicht durch PHP
    Das bringt mich nicht richtig weiter, da damit der Counter über alle Datensätze geht.

    Das bringt dich weiter, wenn du pro Typ einen eigenen Zähler nimmst. Fallunterscheidungen sind mit IF() und CASE realisierbar. Allerdings muss die Anzahl der Typen dafür bekannt sein, da für jeden eine eigene Fallunterscheidung und eine eigene Zählvariable verwendet werden muss.

    Wenn es mehr und nicht vorhersagbare Typen sind, müsstest du tiefer in die Trickkiste greifen und eine Stored Function erstellen, die eine eigene temporäre Tabelle verwendet, in der für jeden Typ ein Zähler verwaltet wird.

    dedlfix.

    1. Tach!

      auch Tachchen :)

      wie kann ich in MySQL 5.1 anhand festgelegter Regeln, für diese Regel automatisch die Datensätze nummerieren lassen?

      Wie lauten diese Regeln genau und was sind die Rahmenbedingungen? Wann soll nummeriert werden? Einmalig den vorhandenen Datenbestand, bei jedem Abfragen, anders?

      Bei dem View soll für jeden Typ von 1 an fortlaufend durchnummeriert werden.

      Ist die Anzahl der Typen auf 2 oder eine andere kleine Anzahl begrenzt oder können da beliebig viele Werte auftreten?

      Datensätze im MySQL-Query nummerieren lassen und nicht durch PHP
      Das bringt mich nicht richtig weiter, da damit der Counter über alle Datensätze geht.

      Das bringt dich weiter, wenn du pro Typ einen eigenen Zähler nimmst. Fallunterscheidungen sind mit IF() und CASE realisierbar. Allerdings muss die Anzahl der Typen dafür bekannt sein, da für jeden eine eigene Fallunterscheidung und eine eigene Zählvariable verwendet werden muss.

      Wenn es mehr und nicht vorhersagbare Typen sind, müsstest du tiefer in die Trickkiste greifen und eine Stored Function erstellen, die eine eigene temporäre Tabelle verwendet, in der für jeden Typ ein Zähler verwaltet wird.

      typ ist beliebig erweiterbar. Die Zählung soll sich später auf einer Datumsspalte beziehen (ORDER BY _date_from). Wenn ein Datensatz gelöscht wird, soll das automatisch berücksichtigt werden. Wenn ich so recht überlege, kann eigentlich nur am Ende (Datum) gelöscht.

      Wie müsste das mit der Stored Function aussehen? Würde das auch mit einer Stored Procedure gehen, der ich z.B. den Typ übergebe und die mir dann die für mich relevanten Spalten zurückgibt?

      Ich möchte in einen anderen Select darauf entweder per Subselect oder Join zugreifen und dann nur die Datendätze abrufen, wo der Counter z.B. den Wert 2 hat.

      Jana

      1. Tach!

        Bitte wie üblich zitieren und nicht einfach alles. Danke.

        typ ist beliebig erweiterbar.

        Dann ist eine Fallunterscheidung nicht anwendbar.

        Wie müsste das mit der Stored Function aussehen? Würde das auch mit einer Stored Procedure gehen, der ich z.B. den Typ übergebe und die mir dann die für mich relevanten Spalten zurückgibt?

        Es kommt darauf an, was am Ende rauskommen soll. Das Wesentliche der Lösung ist der Zwischenspeicher zum Hochzählen pro Typ. Die Frage dazu ist, wann der zurückgesetzt werden soll. Für solch einen Zwischenspeicher bietet sich eine temporäre Tabelle an. Die hat die Eigenschaft, ohne weiteres Zutun am Verbindungsende gelöscht zu werden. Wenn pro Verbindung nur eine Abfrage stattfindet, dann kannst du eine Stored Function nehmen, die den Typ übergeben bekommt und den zugehörige Zählerstand liefert. Die Temp-Tabelle muss die Funktionsaufrufe überleben und das ist auch das Problem, wenn mehrere Abfragen pro Verbindung diese Funktion verwenden. Ansonsten musst du das Ganze in einer Stored Procedure kapseln, also Temp-Table erzeugen, mit einem Cursor durch die Datenmenge laufen, dabei die typabhängige Zählung vornehmen, Ergebnismenge sammeln (da weiß ich grad nicht, ob man eine weitere Temptable braucht oder die Datensätze einfach so ausgeben kann), am Ende jedenfalls Zähler-Temptable löschen.

        Ich möchte in einen anderen Select darauf entweder per Subselect oder Join zugreifen und dann nur die Datendätze abrufen, wo der Counter z.B. den Wert 2 hat.

        Das ist dabei das kleinste Problem, wenn die SP steht. Wenn du allerdings die Zahlen insgesamt nicht benötigst, sondern du nur die Anzahl pro Typ brauchst, dann ist das mit einer einfachen Gruppierung erreichbar.

        dedlfix.