Hank the knife and the Jetset: Suche nach einer Bedingung

Hallo,

ich habe in mysql 5 eine Spalte deren Werte immer so aussehen:

AB-55-22-3432

Mich interessiert hierbei nur der 2 Teil des Inhalts. In diesem Fall die 55.
Und zwar würde ich gerne in die Bedingung einbauen

WHERE "der zweite Teil der Nummer maximal hoch ist"

Also würde bei den Werten

AB-55-21-3432
AB-55-20-3222
AB-55-20-3123
AB-55-20-3662
AB-60-20-3627
AB-55-20-34232
AB-55-20-31112
AB-55-92-34222

nur der Wert

AB-60-20-3627

relevant sein.

Geht das? Hat mysql so ne Art Substringmöglichkeit?

Hank

  1. Tach!

    Geht das? Hat mysql so ne Art Substringmöglichkeit?

    Ja, das geht. Nochmal ja, MySQL hat eine Substring-Funktion und sogar reguläre Ausdrücke. Zu finden im MySQL-Handbuch-Kapitel Funktionen -> String-Funtionen.

    dedlfix.

    1. Auch tach,

      Ja, das geht. Nochmal ja, MySQL hat eine Substring-Funktion und sogar reguläre Ausdrücke. Zu finden

      Hab schon gefunden, aber WHERE MAX(SUBSTRING(Spalte,3,2)) liefert Fehler #1064.

      Hank

      1. Hab schon gefunden, aber WHERE MAX(SUBSTRING(Spalte,3,2)) liefert Fehler #1064.

        Nein, doch Fehler #1111 - Invalid use of group function

        Hank

        1. Tach!

          Hab schon gefunden, aber WHERE MAX(SUBSTRING(Spalte,3,2)) liefert Fehler #1064.
          Nein, doch Fehler #1111 - Invalid use of group function

          Ach, den Maximalwert, das Detail hatte ich überlesen. Aber im Prinzip ist SUBSTRING() schon der richtige Weg. Sortier anschließend nach diesem Wert absteigend und nimm LIMIT 1.

          Das läuft am Ende auf einen Full-Table-Scan hinaus, aber das lässt sich bei der Datenlage nicht vermeiden.

          dedlfix.

          1. Ach, den Maximalwert, das Detail hatte ich überlesen. Aber im Prinzip ist SUBSTRING() schon der richtige Weg. Sortier anschließend nach diesem Wert absteigend und nimm LIMIT 1.

            Ok. Funktioniert prächtig.

            Jetzt habe ich dooferwesie aber festgestellt, dass es ein paar Einträge ala

            ABC-55-78787 gibt, also mit 3 Buchstaben vor der relevanten 2-stelligen Zahl.

            Bekommt man das mit nem IF-Statement und Substring und Order und Limit hin?

            Hank

            1. Tach!

              Jetzt habe ich dooferwesie aber festgestellt, dass es ein paar Einträge ala
              ABC-55-78787 gibt, also mit 3 Buchstaben vor der relevanten 2-stelligen Zahl.
              Bekommt man das mit nem IF-Statement und Substring und Order und Limit hin?

              RegExp hatte ich vorhin schon gesagt, aber das geht doch nicht. Dummerweise kann das MySQL-RegExp nur "entspricht dem Muster"-Aussagen aber nicht Teilausdrücke davon liefern.

              Ein IF-Statement nützt dir hier nichts, aber die IF()-Funktion könnte gehen. Einfacher wird es jedoch mit SUBSTRING_INDEX() sein. Such damit die Position des ersten '-' und schneide von da +1 zwei Zeichen aus.

              dedlfix.

              1. Ein IF-Statement nützt dir hier nichts, aber die IF()-Funktion könnte gehen. Einfacher wird es jedoch mit SUBSTRING_INDEX() sein. Such damit die Position des ersten '-' und schneide von da +1 zwei Zeichen aus.

                Tach,

                ich erhalte aber nicht das, was ich will.

                  
                SELECT ID, SUBSTRING( Nummer, -10, 2 )  
                FROM table  
                WHERE ID > 3  
                ORDER SUBSTRING( Nummer, -10, 2 ) DESC  
                
                

                liefert mir zwar die höchste Nummer aber zugleich die kleinste ID.

                Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.

                AB-55-21-3432
                AB-60-20-3222
                AB-55-20-3123
                AB-55-20-3662
                AB-60-20-3627
                AB-55-20-3423
                AB-55-20-3111
                AB-55-92-3422

                Hier erhalte ich ID 2. Ich bräuchte aber ID 5.

                Hank

                1. Tach!

                  ich erhalte aber nicht das, was ich will.

                  Dann musst du deine Bedingung(en) genauer formulieren.

                  SELECT ID, SUBSTRING( Nummer, -10, 2 )

                  FROM table
                  WHERE ID > 3
                  ORDER SUBSTRING( Nummer, -10, 2 ) DESC

                  
                  >   
                  > liefert mir zwar die höchste Nummer aber zugleich die kleinste ID.  
                    
                  Du wertest nur den zweiten Teil des Ausdrucks aus, und dann stehen alle 60er vorn, aber innerhalb derer ist keine Reihenfolge definiert.  
                    
                  
                  > Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.  
                    
                  Definiere "Nummernwert" und bau ihn in die Sortierbedingung ein.  
                    
                    
                    
                  dedlfix.
                  
                  1. N'abend.

                    Du wertest nur den zweiten Teil des Ausdrucks aus, und dann stehen alle 60er vorn, aber innerhalb derer ist keine Reihenfolge definiert.

                    Richtig.

                    Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.

                    Definiere "Nummernwert" und bau ihn in die Sortierbedingung ein.

                    Ist es nicht so, dass ich das bereits mache, aber die ID in der Sortierbedingung fehlt?

                    Ich verstehe das nicht.

                    Hank

                    1. Tach!

                      Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.
                      Definiere "Nummernwert" und bau ihn in die Sortierbedingung ein.
                      Ist es nicht so, dass ich das bereits mache, aber die ID in der Sortierbedingung fehlt?

                      Nein. Dein Sortierkriterium sind lediglich die zwei Zeichen ab Position -10. Wenn du weitere Bestandteile von dem Feldinhalt heranziehen möchtest, musst du die ebenfalls erst einmal extrahieren.

                      dedlfix.

                      1. Nein. Dein Sortierkriterium sind lediglich die zwei Zeichen ab Position -10. Wenn du weitere Bestandteile von dem Feldinhalt heranziehen möchtest, musst du die ebenfalls erst einmal extrahieren.

                        Ich wollte eigentlich keinen weiteren Inhalt des Feldinhaltes in die Sortierung einbeziehen, sondern die ID. Aber ID und (bisher) einbezogener Feldinhalt scheinen sich zu wiedersprechen?

                        Du meinst, ich sollte nicht die ID, sondern die letten 4 Ziffern mit einbeziehen?

                        Hank

                        1. Tach!

                          Nein. Dein Sortierkriterium sind lediglich die zwei Zeichen ab Position -10. Wenn du weitere Bestandteile von dem Feldinhalt heranziehen möchtest, musst du die ebenfalls erst einmal extrahieren.
                          Ich wollte eigentlich keinen weiteren Inhalt des Feldinhaltes in die Sortierung einbeziehen, sondern die ID. Aber ID und (bisher) einbezogener Feldinhalt scheinen sich zu wiedersprechen?

                          Nein, du kannst gern auch noch nach der ID sortieren, die du dann als zweites Kriterium im ORDER BY unterbringen musst. Aber eine ID hat zu identifizieren. Niemand garantiert, dass für die ID Werte in einer bestimmten Reihenfolge vergeben werden (wenn man sie nicht selbst festlegt) - auch wenn das (bei auto_increment) de facto so ist.

                          Du meinst, ich sollte nicht die ID, sondern die letten 4 Ziffern mit einbeziehen?

                          Ich kenne deine Daten nicht. Aber eine ID als Ordnungskriterium ist für mich eigentlich kein Teil einer bevorzugten Lösung. Ich dachte, du wolltest in Wirklichkeit nach dem letzten Teil des Feldinhalts sortieren, denn das passte (vielleicht nur zufällig) auch auf deine Beispieldaten.

                          Was auch immer du am Ende nimmst, es muss mit ins ORDER BY.

                          dedlfix.

                          1. Was auch immer du am Ende nimmst, es muss mit ins ORDER BY.

                            Jau, es funktioniert nur nicht (bei mir).

                            SELECT ID, SUBSTRING( Nummer, -10, 2 )
                            FROM table
                            WHERE ID > 3
                            ORDER SUBSTRING( Nummer, -10, 2 ),ID DESC

                            ergibt ebenfalls ein falsches Ergebnis.

                            Und

                            SELECT ID,
                            SUBSTRING(Nummer,-10,2),
                            SUBSTRING(Nummer,-4,4)
                            FROM table
                            where
                            ID > 3
                            ORDER BY SUBSTRING(Nummer,-10,2),SUBSTRING(Nummer,-4,4) DESC

                            ergibt auch ein falsches Ergebnis :-(

                            Sch...ße, wenns nicht irrsinnig dringend wäre, würde ich besser für heute aufhören, aber es muß morgen früh laufen. :-(

                            Hank

                            1.   
                              SELECT ID, SUBSTRING( Nummer, -10, 2 ) , SUBSTRING( Nummer, -4, 4 )  
                              FROM table  
                              WHERE ID >3  
                              ORDER BY SUBSTRING( Nummer, -10, 2 ), SUBSTRING( Nummer, -4, 4 ) DESC  
                              
                              

                              ergibt
                              ID      Nr      lfd.NR.
                              9 12 6444
                              12 13 0009
                              7 13 0004
                              6 13 0003
                              13 13 0002
                              4 13 0001

                              Ich möchte aber

                              ergibt
                              ID      Nr      lfd.NR.
                              12 13 0009
                              ...

                              P.S: An den IDs habe ich rumgewerkelt. Die stimmen also (trotz ai) nicht mehr überein.

                              Hank

                            2. Tach!

                              ORDER SUBSTRING( Nummer, -10, 2 ),ID DESC
                              ergibt ebenfalls ein falsches Ergebnis.

                              Jedes Kriterium braucht sein eigenes DESC. So wie du das notiert hast, hat das SUBSTRING() keins und wird ASC sortiert. Also schreib noch ein DESC vor das Komma.

                              dedlfix.

                              1. dedlfix?

                                Mensch, das rettet mir grad "den Kragen"!

                                Danke. Danke. Danke!

                                Kann man denn auch 1 x DESC und 1 x ASC machen?

                                Also ORDER BY spalte1 DESC, spalte2 ASC????

                                Hank

                                1. Tach!

                                  Kann man denn auch 1 x DESC und 1 x ASC machen?

                                  Das hast du ja schon unwillentlich gemacht. Jedes Kriterium kann seine eigene Sortierrichtung haben und ASC kann man weglassen.

                                  dedlfix.

                                  1. Das hast du ja schon unwillentlich gemacht. Jedes Kriterium kann seine eigene Sortierrichtung haben und ASC kann man weglassen.

                                    Ich dachte wirklich, das geht nicht.

                                    Dedlfix! Danke für Deine Hilfe.

                                    Für mich persönlich bist Du das "selfforum"!

                                    Gute N8.

                                    Hank