Christian Bliß: MySQL / Perl -Auslesen von Zeilen-

Hallo,

habe eine MySQL-Datenbank angelegt, mit 5 Spalten.

Name - Hersteller - Datum - Sonstiges - ID

Ausgegeben wird alles, bis auf "ID". Ich möchte nun aber nur die Zeilen ausgeben, bei denen der Name mit einem "A" beginnt, wie mache ich das??

MfG Christian Bliß

  1. hallo,

    wenn Du den Namen als Index hast, wird Dir LIKE 'a%' sicherlich behilflich sein ;)

    http://www.mysql.de/documentation/mysql/bychapter/manual.de_Reference.html#IDX1180

    Ich hoffe geholfen zu haben ;)

    Gruss
    Andreas

    1. Hallo,

      brauche noch mal Hilfe!
      Habe LIKE 'a%' eingefügt, jedoch wird nun anstelle des Namens entweder eine "1" (falls Name mit A beginnt) oder eine "0" (falls Name nicht mit A beginnt) ausgegeben.
      Ich möchte aber NUR die Zeilen ausgeben, bei denen der Name mit A anfängt, wie geht das?

      MfG Christian Bliß

      1. Hallo Christian,

        Habe LIKE 'a%' eingefügt, jedoch wird nun anstelle des Namens entweder eine "1" (falls Name mit A beginnt) oder eine "0" (falls Name nicht mit A beginnt) ausgegeben.

        Wenn du uns jetzt noch den Query mit dem du es versucht hast, zeigst, können wir dir vielleicht auch helfen - ich tippe aber mal darauf, dass dein Query etwa so aussieht:

        SELECT name LIKE 'a%' FROM...

        Bedingungen gehören aber in den WHERE-Teil des Querys, also etwa so:

        SELECT name FORM ... WHERE name LIKE 'a%'

        wobei ich eher "... WHERE SUBSTRING(name,1,1)='a'"[1] verwenden würde.

        Grüße aus Nürnberg
        Tobias

        [1] http://www.mysql.de/doc/de/String_functions.html#IDX1152 (Vorsicht, mysql fängt nicht bei 0 sondern bei 1 das Zählen an)

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. Hallo Tobias,

          SELECT name FORM ... WHERE name LIKE 'a%'

          wobei ich eher "... WHERE SUBSTRING(name,1,1)='a'"[1] verwenden würde.

          Und das hätte welchen Vorteil? Zumal
          ... WHERE LEFT(name,1)='a'
          viel kürzer ist. Alledings sehe ich auch dort keinen Vorteil gegenüber
          ... WHERE name LIKE 'a%'
          oder
          ... WHERE name REGEXP '^a'
          , weil es nämlich zur 100%-igen Ersetzung
          ... WHERE LEFT(name,1)='a' OR LEFT(name,1)='A'
          heißen müsste.

          viele Grüße

          Axel

          1. Hallo Axel,

            wobei ich eher "... WHERE SUBSTRING(name,1,1)='a'"[1] verwenden würde.
            Und das hätte welchen Vorteil? Zumal
            ... WHERE LEFT(name,1)='a'
            viel kürzer ist.

            *mist* du hast recht - nur vergesse ich die Funktion immer :-)

            Alledings sehe ich auch dort keinen Vorteil gegenüber
            ... WHERE name LIKE 'a%'

            CK wird wissen von was er redet, wenn er von LIKE abrät: </archiv/2002/3/6910/#m38231> :-)

            ... WHERE name REGEXP '^a'

            ein regulärer Ausdruck ist hier wohl etwas oversized :-)

            , weil es nämlich zur 100%-igen Ersetzung
            ... WHERE LEFT(name,1)='a' OR LEFT(name,1)='A'
            heißen müsste.

            nein, LEFT(name,1)='a' findet sowohl "Andreas" als auch "andreas"

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. Hallo Tobias,

              Alledings sehe ich auch dort keinen Vorteil gegenüber
              ... WHERE name LIKE 'a%'
              CK wird wissen von was er redet, wenn er von LIKE abrät: </archiv/2002/3/6910/#m38231> :-)

              Du musst _genauer_ lesen. Dort ist von "name LIKE '%ausdruck%'" (zwei! %) die Rede. Das ist die Suche nach dem Ausdruck in der _Mitte_ des Feldinhalts. Das _kann_ von keinem Index abgedeckt sein und erfordert in jedem Fall einen Full Table Scan. Bei den Suche mit "name LIKE 'a%'" wird aber ein Index auf dem Feld name schon berücksichtigt.

              ... WHERE name REGEXP '^a'
              ein regulärer Ausdruck ist hier wohl etwas oversized :-)

              Warum?

              , weil es nämlich zur 100%-igen Ersetzung
              ... WHERE LEFT(name,1)='a' OR LEFT(name,1)='A'
              heißen müsste.
              nein, LEFT(name,1)='a' findet sowohl "Andreas" als auch "andreas"

              Stimmt. MySQL vergleicht ja selbst mit dem Operator = nicht nach Gross- und Kleinschreibung. Es sei denn, man fordert einen BINARY-Vergleich.

              mysql> select "a" = "A";
                      -> 1
              mysql> select BINARY "a" = "A";
                      -> 0

              viele Grüße

              Axel

              1. Hallo Axel,

                Alledings sehe ich auch dort keinen Vorteil gegenüber
                ... WHERE name LIKE 'a%'
                CK wird wissen von was er redet, wenn er von LIKE abrät: </archiv/2002/3/6910/#m38231> :-)
                Du musst _genauer_ lesen. Dort ist von "name LIKE '%ausdruck%'" (zwei! %) die Rede. Das ist die Suche nach dem Ausdruck in der _Mitte_ des Feldinhalts. Das _kann_ von keinem Index abgedeckt sein und erfordert in jedem Fall einen Full Table Scan. Bei den Suche mit "name LIKE 'a%'" wird aber ein Index auf dem Feld name schon berücksichtigt.

                stimmt, das könnte sein - da ich es nicht weiß, glaube ich es dir einfach mal :-)

                ... WHERE name REGEXP '^a'
                ein regulärer Ausdruck ist hier wohl etwas oversized :-)
                Warum?

                für was extra die regex-Engine anwerfen, wenn es auch mit schnelleren String-Funktionen geht? (ja, ich weiß man soll nicht mit Gegenfragen antworten, aber ich wüsste nicht, für was man hier mit regulären Ausdrücken arbeiten sollte)

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                1. Hallo,

                  danke an alle, hat nun funktioniert!
                  Nun habe ich noch ein letzte Frage: Wie heißt der Ausdruck, wenn ich alle Zeilen anzeigen will, die mit einer ZAHL beginnen?? (Es ist egal welche Zahl, irgendeine zwischen 0-9)

                  MfG Christian Bliß

                  1. Hallo Christian,

                    Nun habe ich noch ein letzte Frage: Wie heißt der Ausdruck, wenn ich alle Zeilen anzeigen will, die mit einer ZAHL beginnen?? (Es ist egal welche Zahl, irgendeine zwischen 0-9)

                    da brauchst du jetzt vermutlich einen Regulären Ausdruck (außer du willst alle Zahlen einzeln auflisten), etwa so: WHERE feldname REGEXP '[1]' (->http://www.mysql.de/doc/de/String_comparison_functions.html#IDX1183)

                    Grüße aus Nürnberg
                    Tobias

                    --
                    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|

                    1. 0-9 ↩︎