Where-Abfrage nach mehrerer Begriffen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Where-Abfrage nach mehrerer Begriffen

    Hallo Leute,

    ich weiß nicht, wonach ich suchen muss, um die Lösung zu finden ... daher direkt meine Frage.

    Beispieltabelle:

    ------------------------------
    id | text
    ------------------------------
    1 | test
    2 | beispiel
    3 | test beispiel
    4 | beispiel test
    ------------------------------

    Nun habe ich ein Suchformular, in dem "test beispiel" eingegeben wird.

    Herauskommen sollen die Datensätze 3 UND 4. Wie muss die Abfrage lauten?

    select * from Beispieltabelle where text like '%test%beispiel%'
    -> es kommt nur Datensatz 3

    select * from Beispieltabelle where text like '%test%' and text like '%beispiel%'
    -> es kommen Datensätze 3 und 4

    Letzteres ist ja schön und gut, aber da ich ein vorfurmuliertes SQL-Statement (Stored Procedure im MS-SQL-Server) nutzen möchte, in der Art ...

    select * from Beispieltabelle where text like '%' + @suchString + '%'

    ... möchte ich dem Statement nur eine Variable übergeben (@suchstring = 'test%beispiel'), um meine Treffer zu bekommen.

    Gibt es irgendeine Möglichkeit zu umgehen, dass ich für jeden einzelnen Suchbegriff ein eigene where-Einschränkung einsetzen muss?
    Das Ganze soll natürlich möglichst dynamisch sein und eben unabhängig von der Reihenfolge der eingegebenen Suchbegriffe.

    Gruß, Jokin

  • #2
    select * from Beispieltabelle where `text` like '%test%' [COLOR=green]or[/COLOR] `text` like '%beispiel%'

    Nebenbei: Ich würd niemals eine Spalte text nennen ... das ist nämlich ein reserviertes Wort. Wenn du das schon tun musst, dann schließ den Namen immer in Backticks ein!
    Zuletzt geändert von Titus; 16.03.2004, 12:43.
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Hallo Titus,

      Ich würde eine Tabelle auch nie "Beispieltabelle" nennen ... es ist nur ein Bespiel!

      Mit Deiner Abwandlung würde ich auf den Suchbegriff "test beispiel" auch Datensatz 1 und 2 herausbekommen.

      Aber genau das ist doch das Problem, ich möchte durch weitere Suchbegriffe meine Suche weiter einschränken, nicht ausweiten.
      Mehrere Suchbegriffe werden "und"-verknüpft.

      Google-like eben ...

      Gruß, Jokin

      Kommentar


      • #4
        Original geschrieben von Jokin
        Hallo Titus,

        Ich würde eine Tabelle auch nie "Beispieltabelle" nennen ... es ist nur ein Bespiel!

        Mit Deiner Abwandlung würde ich auf den Suchbegriff "test beispiel" auch Datensatz 1 und 2 herausbekommen.

        Aber genau das ist doch das Problem, ich möchte durch weitere Suchbegriffe meine Suche weiter einschränken, nicht ausweiten.
        Mehrere Suchbegriffe werden "und"-verknüpft.

        Google-like eben ...

        Gruß, Jokin
        dann halt und statt oder nehmen
        mfg
        marc75

        <Platz für anderes>

        Kommentar


        • #5
          Hallo Marc,

          schau mal mein Einstiegsposting an. Dort habe ich "oder" benutzt und auch geschrieben, warum es in meinem Falle nicht damit geht.

          Es muss dynamisch für beliebig viele Suchbegriffe sein. Und es muss später über mehrere Spalten gesucht werden, aber das Problem ist nicht sooo wild.

          Das ganz oben beschriebene Problem ist immernoch nicht gelöst.

          Gruß, Jokin

          Kommentar


          • #6
            oh ... 3 und 4 ... nicht 1 und 2 ... sorry; wer lesen kann ist besser dran

            also: ohne AND geht es nicht. Aber mit ein paar Zeilen PHP kannst du dir die Query ganz einfach zusammen bauen:
            PHP-Code:
            $suche $_REQUEST['suche']; # z.B. $suche=" test  beispiel  "
            $begriffe preg_split('/\s+/'$suche, -1PREG_SPLIT_NO_EMPTY);
            $ar_where = array();
            foreach(
            $begriffe as $wort)
              
            $ar_where[] = "text like '%"mysql_escape_string($wort). "%'";
            $query "select * from Beispieltabelle where "implode(' and '$ar_where); 
            mein Sport: mein Frühstück: meine Arbeit:

            Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

            Kommentar


            • #7
              Hi Titus,

              ja, dass ich mir die Abfrage per PHP und einigen Schleifen bauen kann, weiß ich - aber dennoch ist dadurch nicht das Prolem gelöst.

              Denn die Abfrage ist vordefiniert, sodass ich nur noch eine Variable übergebe.

              Ich frage ja auch in mehreren Feldern ab ... das kommt ja noch erschwerend hinzu.

              Dass es mit AND, OR und LIKE nicht so einfach geht, ist bekannt - vielelicht kennt jemand ja eine Konstruktion mit außergewöhnlicheren SQL-Befehlen "exist in" oder "sounds" ... nur so als Beispiel ...

              Gruß, Jokin

              Kommentar


              • #8
                implode, explode

                einfach oder, und, - und + mit str_replace durch '' ersetzen lassen und anhand von dem leerzeichen aufsplitten und nach jedem schlüsselwort suchen.

                cya max


                An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

                Kommentar


                • #9
                  wieviele Argument hast du denn bei der SP zu übergeben ? Sollen denn
                  Informationen über Tabellenname, Spaltenname und Spaltenname in
                  Argument(e) enthalten sein, oder du hast nur den Suchbegriff zu
                  übergeben ? Wäre vielleicht hilfreich, wenn du die SP mal zur Verfügung stellt.

                  Kommentar


                  • #10
                    Die SP bekommt einen einzigen Parameter übergeben: @suchBegriff

                    In diesem Parameter steht @suchBegriff='test beispiel'

                    Und mit diesem Suchbegriff muss die SP in der Lage zu sein, aus der obigen Beispieltabelle die Zeile 3 UND 4 zurückzugeben.

                    Nun die Frage: Wie lautet der notwendige Inhalt in der SP?

                    create proc testsp
                    @suchBegriff varchar(400)
                    as

                    set @suchBegriff = replace(' ', '%', @suchBegriff)

                    select * from beispieltabelle where text like '%' + @suchbegriff + '%'

                    go


                    ... so ungefähr sieht die SP in dem arg vereinfachten Fall aus. (Im Original hat sie weit über 300 Zeilen ...)

                    Nur so hat sie eben den Fehler, dass ich NUR den Datensatz 3 heraus bekomme, obwohl beide Suchbegriffe ja auch im Datensatz 4 enthalten sind.

                    Wahrscheinlich wird das auf eine superaufwendige SQL-Konstruktion hinauslaufen, bei der das SQL-Statement um den Suchbegriff herum gebastelt wird und am Ende mit "exec(@sql)" ausgeführt wird ... hölle ...

                    Gruß, Jokin

                    Kommentar


                    • #11
                      Tja, in diesem Fall hilft dir die ganzen Zerlegungen in PHP à la @Titus
                      nichts, sondern du muss den Suchbegriff in der SP entsprechend
                      aufbereiten. Und neben bei MS-SQL mag sowieso:

                      where colFieldname like '%abc%' and '%edf%'

                      nicht. Ob MySQL das packt, weiss ich nicht.
                      Nun ja. Es ist schon schwierig den Suchbegriff in der SP zu zerlegen.
                      Versuch mal mit Cursor und Subselect. Ich schlafe mal 'ne Nacht drüber

                      Wart' mal du hast schon 300 Zeilen in der SP? Wofür sind die, wenn das
                      Grundproblem noch nicht mal ansatzweise gelöst ist
                      Warst du schon in der MS-Newsgroups? Elmar oder Uwe kann dir bestimmt helfen.

                      Kommentar


                      • #12
                        Versuch mal hiermit, sollte eigentlich das liefern was du brauchst. Der
                        Suchbegriff lautet z.B. "test ". Angehängtes Leerzeichen verhindert die Übernahme von "test" in das Ergebnis. Wenn du ohne Leerzeichen in
                        @strpart haben möchtest muss du in substring @pos-1 angeben.

                        PHP-Code:
                        CREATE PROCEDURE sp_mysearch
                        @strsearch char(250)

                        AS

                        declare @
                        strpart varchar(50), @sql varchar(500), @pos int, @strwhere varchar(250)

                        set @sql 'select * from atest '
                        set @pos charindex(' ',@strsearch,1)
                        set @strpart substring(@strsearch,1,@pos)
                        set @strwhere 'where (strdesc like ''' + @strpart '%'')'
                        /*print 'part: ' + @strpart
                        print 'pos: ' + cast(@pos as char(2))
                        print 'search: ' + @strsearch */
                        while @pos>
                          begin
                            set 
                        @strsearch stuff(@strsearch,1,@pos,'')
                            
                        set @pos charindex(' ',@strsearch,1)
                            if @
                        pos=break 
                            
                        set @strpart substring(@strsearch,1,@pos)
                            
                        set @strwhere = @strwhere ' or (strdesc like ''' + @strpart '%'')'
                            
                        /* print 'part: ' + @strpart
                            print 'pos: ' + cast(@pos as char(2))
                            print 'search: ' + @strsearch */
                          
                        end
                        set 
                        @sql = @sql + @strwhere
                        /* print '-----'
                        print 'where: ' + @strwhere
                        print 'sql: ' + @sql */
                        exec(@sql
                        du kannst soweit treiben, dass du Tabellennamen und/oder Spaltennamen
                        als Argument zusätzlich übergibst. Die Printzeilen kannst du aktivieren,
                        wenn du im QA die SP aufrufst, somit siehst du auch, was in der SP passiert.

                        Viel Spass.

                        PS: ist zwar keine 300 Zeilen, aber funz

                        Kommentar


                        • #13
                          Alles klar .... so geht's.

                          Die Where-Klausel wird im PHP-Skript erstellt und der SP als String übergeben.

                          In der SP wird das SQL-Statement zusammengesetzt und mit "exec(...)" ausgeführt.

                          Gruß, Jokin

                          Kommentar

                          Lädt...
                          X