bert: select like einzelnes wort

hi,

kann ich von einer SELECT WHERE LIKE Abfrage als Ergebnis statt der ganzen Spalte auch nur das Wort auswählen, welches auf die LIKE Einschränkung zutrifft?

Abfrage ist folgende:
$query = mysql_query("SELECT DISTINCT ".$search_column." FROM ".$db_table." WHERE ".$search_column." LIKE '".$search_part."' ");

$search_part sieht dann beispielsweise so aus --> '% '.$q.'%'

D.h es gibt mir aller Zellen der Spalte $search_column, bei dem eines der Wörter genauso anfängt, wie der string $q (Bsp.: "even")

Soweit klappt das auch. Jetzt möchte ich aber nicht den gesamten Zelleninhalt haben, wie bisher:

while ($row = mysql_fetch_assoc($query)) {  
	$word = $row[$search_column];  
	$results[] = $word;  
}

(Bsp.: "big event on saturday")

Sondern ich will als Ausgabe nur das Wort "event", weil dieses Wort auf das Suchkriterium passt.

Kann ich das beim query schon separieren oder muss ich da mit php die Ausgabe nach " " exploden und mir das Wort suchen? Gibt doch bestimmt ne schnellere Variante..

Danke und Gruß

  1. Hi!

    kann ich von einer SELECT WHERE LIKE Abfrage als Ergebnis statt der ganzen Spalte auch nur das Wort auswählen, welches auf die LIKE Einschränkung zutrifft?

    LIKE arbeitet nicht wortweise, also kann das DBMS auch nicht nur anhand eines Wortes selektieren und nicht ohne weitere Stringverarbeitung nur ein einzelnes Wort zurückliefern.

    Abfrage ist folgende:
    $query = mysql_query("SELECT DISTINCT ".$search_column." FROM ".$db_table." WHERE ".$search_column." LIKE '".$search_part."' ");
    $search_part sieht dann beispielsweise so aus --> '% '.$q.'%'
    D.h es gibt mir aller Zellen der Spalte $search_column, bei dem eines der Wörter genauso anfängt, wie der string $q (Bsp.: "even")

    Bei SQL-Problemen bitte den SQL-Code angeben, nicht irgendwelchen PHP-Code, der das Statement zusammenbaut. Außerdem liefert %even% nicht nur dann ein Ergebnis, wenn es am Anfang vorkommt.

    Soweit klappt das auch. Jetzt möchte ich aber nicht den gesamten Zelleninhalt haben, wie bisher:
    Sondern ich will als Ausgabe nur das Wort "event", weil dieses Wort auf das Suchkriterium passt.

    Reguläre Ausdrücke können Wortgrenzen finden.

    Lo!

    1. Verstehe deine Kritikpunkte nicht.

      Bei SQL-Problemen bitte den SQL-Code angeben, nicht irgendwelchen PHP-Code, der das Statement zusammenbaut.

      Habe kein SQL-Problem, sondern möchte ein einzelnes Wort selektieren und dachte, dass geht eventuell mit SELECT.

      Außerdem liefert %even% nicht nur dann ein Ergebnis, wenn es am Anfang vorkommt.

      Wie du in meinem Post siehst, wird auch nicht nach "%even%" sondern nach "% even%" gesucht, also steht es immer am Anfang eines Wortes

      Reguläre Ausdrücke können Wortgrenzen finden.

      Bedeutung dieses Satzes will mir nicht klar werden.. Willst du auf ne bestimmte Funktion hinaus, die mit PHP aus einem String ein bestimmt Wort rausfiltern kann a la give_word('%q%', $string) ??

      1. Hallo!

        Verstehe deine Kritikpunkte nicht.

        es gab ja auch keine, sondern einen gutgemeinten Ratschlag.

        Bei SQL-Problemen bitte den SQL-Code angeben, nicht irgendwelchen PHP-Code, der das Statement zusammenbaut.

        Habe kein SQL-Problem,

        Immer die SQL-Aholiker - am Anfang streiten sie alles ab;)

        sondern möchte ein einzelnes Wort selektieren und dachte, dass geht eventuell mit SELECT.

        Und das ja bekanntlich nichts mit SQL zu tun!

        Außerdem liefert %even% nicht nur dann ein Ergebnis, wenn es am Anfang vorkommt.

        Wie du in meinem Post siehst, wird auch nicht nach "%even%" sondern nach "% even%" gesucht, also steht es immer am Anfang eines Wortes

        Es sei denn, das Wort steht ganz am Anfang, oder?

        Reguläre Ausdrücke können Wortgrenzen finden.

        Bedeutung dieses Satzes will mir nicht klar werden..

        Reguläre Ausdrücke kennt auch Mysql.

        Ciao

        GG

        --
        "If I do not seek to understand what is happening here
        - then I've got peanuts in my head!"
        (I. Hosein)
        1. es gab ja auch keine, sondern einen gutgemeinten Ratschlag.

          "Außerdem liefert %even% nicht nur dann ein Ergebnis, wenn es am Anfang vorkommt." klingt für mich nach Kritik ;-)

          Wie du in meinem Post siehst, wird auch nicht nach "%even%" sondern nach "% even%" gesucht, also steht es immer am Anfang eines Wortes

          Es sei denn, das Wort steht ganz am Anfang, oder?

          Ja, hab halt ne foreach-Schleife drumrum, die vorher auch nach $q.'%' sucht ^^

          Reguläre Ausdrücke kennt auch Mysql.

          Das klingt nach nem gutgemeinten Ratschlag. Durchblicke das aber glaub ich noch nicht so ganz. Kannst du mir sagen, wie mein SELECT Befehl aussehen muss, damit er nur das Wort selected, wo $q am Anfang auftaucht?
          Würde mir riesig weiterhelfen.
          Danke

          1. Hi!

            es gab ja auch keine, sondern einen gutgemeinten Ratschlag.
            "Außerdem liefert %even% nicht nur dann ein Ergebnis, wenn es am Anfang vorkommt." klingt für mich nach Kritik ;-)

            Wie du in meinem Post siehst, wird auch nicht nach "%even%" sondern nach "% even%" gesucht, also steht es immer am Anfang eines Wortes

            Hab ich nicht gesehen, weil ich es nicht beachtet hatte.

            Das klingt nach nem gutgemeinten Ratschlag. Durchblicke das aber glaub ich noch nicht so ganz. Kannst du mir sagen, wie mein SELECT Befehl aussehen muss, damit er nur das Wort selected, wo $q am Anfang auftaucht?
            Würde mir riesig weiterhelfen.

            Schon klar, aber uns™ bereitet es weniger Vergnügen hier einfach nur eine Lösung zu erarbeiten und sie abzukippen. Deine aktive Mitarbeit bei der Lösungsfindung wird im Allgemeinen erwartet.

            Wie weit bist du mit deinem Versuch gekommen, einen regulären Ausdruck auf dein Problem zu erstellen und wo genau lagen die Schwierigkeiten?

            Lo!

            1. Hab ich nicht gesehen, weil ich es nicht beachtet hatte.

              ist ja auch irrelevant ^^

              Schon klar, aber uns™ bereitet es weniger Vergnügen hier einfach nur eine Lösung zu erarbeiten und sie abzukippen. Deine aktive Mitarbeit bei der Lösungsfindung wird im Allgemeinen erwartet.

              Versteh ich. Bin ich auch dafür.

              Wie weit bist du mit deinem Versuch gekommen, einen regulären Ausdruck auf dein Problem zu erstellen und wo genau lagen die Schwierigkeiten?

              Siehe hier

          2. Reguläre Ausdrücke kennt auch Mysql.

            nett, warum wusste ich das noch nicht

            Das klingt nach nem gutgemeinten Ratschlag. Durchblicke das aber glaub ich noch nicht so ganz. Kannst du mir sagen, wie mein SELECT Befehl aussehen muss, damit er nur das Wort selected, wo $q am Anfang auftaucht?
            Würde mir riesig weiterhelfen.
            Danke

            Seine Links anklicken würde auch helfen, dann währe dir aufgefallen, das dein Problem gleich in einem der ersten Beispiele vorkommt ;-)

            1. Seine Links anklicken würde auch helfen, dann währe dir aufgefallen, das dein Problem gleich in einem der ersten Beispiele vorkommt ;-)

              Hab ich angeklickt und durchgelesen. Hab sie auch ausprobiert, leider ohne Erfolg.
              Mein Verständnisproblem:
              So kann ich überprüfen, ob ein Wort in der Zeichenkette vorkommt (und erhalte dann 0 oder eben 1). Aber wie wähle ich dieses eine Wort als Rückgabewert aus?
              Diese regulären Ausdrücke habe ich auch in meiner .htacces verwendet, die Grundidee ist mir also bekannt. Aber mit was genau muss ich wo in die Zeile

              $query = mysql_query("SELECT DISTINCT ".$search_column." FROM ".$db_sub_table." WHERE ".$search_column." LIKE '".$search_part."' ");

              einbauen, damit er mir nur das eine zutreffende Wort ausspuckt?

              Wenn ich die Zeile beispielsweise um REGEXP '[[:<:]]".$q."' erweitere ändert sich an der Ausgabe überhaupt nichts.

              Kann mir nicht jemand die Zeile um den einen Befehl erweitern, der nätig ist? Ich lerne nun mal am Besten von funktionierenden Ergebnissen, wenn ich sie mir wieder rückwärts aufschlüssele.

              Würde mich freuen

              1. Mein Verständnisproblem:
                So kann ich überprüfen, ob ein Wort in der Zeichenkette vorkommt (und erhalte dann 0 oder eben 1). Aber wie wähle ich dieses eine Wort als Rückgabewert aus?

                Also im Prinzip ähnelt REGEXP ja dem LIKE (wenn ich das richtig verstanden habe.

                Also ich kann zwar mit den regulären Ausdrücken festlegen, nach was er suchen soll (und mit /b$q zum Beispiel, dass $q am Wortanfang stehen muss), aber Selected wird doch trotzdem die gesamte Spalte... Ich will aber nur das Wort als Aussgabewert. Dafür bringt mir nach meiner Auffassung REGEXP nichts. Kann also sein, dass mein Problem schon im Verständnis von REGEXP liegt. Aber auch durch googlen hab ich kein Beispiels finden können, welches mit REGEXP etwas in der Art tut, wie ich es will..

                1. Also ich kann zwar mit den regulären Ausdrücken festlegen, nach was er suchen soll (und mit /b$q zum Beispiel, dass $q am Wortanfang stehen muss), aber Selected wird doch trotzdem die gesamte Spalte... Ich will aber nur das Wort als Aussgabewert. Dafür bringt mir nach meiner Auffassung REGEXP nichts. Kann also sein, dass mein Problem schon im Verständnis von REGEXP liegt. Aber auch durch googlen hab ich kein Beispiels finden können, welches mit REGEXP etwas in der Art tut, wie ich es will..

                  Natürlich, dieser Hinweis sollte deine a) 2 Abfragen zu einer zusammenfalssen und b) PHP kann auch regexp (preg_replace), du müsstest nichtmal viel in der Abfrage ändern.

                  1. (preg_replace)

                    *hust*
                    preg_grep wäre natürlich Sinnvoller.

                    1. preg_grep wäre natürlich Sinnvoller.

                      Super. Das war die Antwort meiner Frage (Gebete..) :-)

                      Habs wie folgt gelöst:

                      while ($row = mysql_fetch_assoc($query)) {  
                      	$word = $row[$search_column];  
                      	$word = preg_grep("/^$q/", explode(" ", $word));  
                      	foreach($word as $suggest_word) {  
                      		$results[] = $suggest_word;  
                      	}  
                      }
                      

                      Vielen Dank für eure Hilfe!

                    2. Zusatzfrage:

                      $word = preg_grep("/$q/iU", explode(" ", $word));

                      Spuckt bei der Suche nach 'arktführ' als Ergbnis '"Marktführer' aus, weil es einen DB-Eintrag gibt, der '"Marktführer in der Region"' gibt.
                      Kann ich auch sagen, ich will nur Wörter, also keine Sonderzeichen vor und nach dem Wort?

                      1. Hi!

                        Kann ich auch sagen, ich will nur Wörter, also keine Sonderzeichen vor und nach dem Wort?

                        Ja, indem du nach Wortgrenzen oder Nicht-Wort-Zeichen suchst und nicht einfach nur am Leerzeichen auftrennst, denn auch Kommas können hinter Wörtern stehen.

                        Du willst also eine Gruppe (<-Stichwort!) aus deinem Suchbegriff und Wortzeichen bilden, vorangehend und gefolgt von einem Nicht-Wort-Zeichen oder einer Wortgrenze.

                        Lo!

                        1. Du willst also eine Gruppe (<-Stichwort!) aus deinem Suchbegriff und Wortzeichen bilden, vorangehend und gefolgt von einem Nicht-Wort-Zeichen oder einer Wortgrenze.

                          Bin bei meiner Suche auf preg_split gestoßen, welches Regexps benutzt und ein array ausgeben soll:

                          $word = preg_grep("/^$q/iU", preg_split("/\W/", $word));

                          Komme dem Ziel näher. Nun machen mir aber meine Umlaute Probleme (also die werden wohl als \W gewertet). Habe alles fein auf utf8 umgestellt (Dateiformat, .htaccess Anweisung, DB, Verbindung zwischen DB und Client,...). Heißt das, ich muss meine Codezeile jetzt auch irgendwie mit Multibyte Befehlen schreiben? Das Thema hab ich nur am Rande mal eingelesen..

                          1. Am einfachsten wäre, wenn es wie hier bei [:punct:] auch einen equvalenten Ausdruck für php gäbe :-)

                            1. Am einfachsten wäre, wenn es wie hier bei [:punct:] auch einen equvalenten Ausdruck für php gäbe :-)

                              Dann währe POSIX deine Lösung? :)

                          2. Hi!

                            Du willst also eine Gruppe (<-Stichwort!) aus deinem Suchbegriff und Wortzeichen bilden, vorangehend und gefolgt von einem Nicht-Wort-Zeichen oder einer Wortgrenze.

                            Bin bei meiner Suche auf preg_split gestoßen, welches Regexps benutzt und ein array ausgeben soll:
                            $word = preg_grep("/^$q/iU", preg_split("/\W/", $word));

                            Nimm doch lieber preg_match_all() statt selbst zu splitten und dann passt auch meine Anleitung von oben.

                            Komme dem Ziel näher. Nun machen mir aber meine Umlaute Probleme (also die werden wohl als \W gewertet).

                            Welche locale-Einstellung hast du denn vorliegen, oder anders: stell doch mal Deutsch ein, wenn du deutsche Regeln haben willst.

                            Habe alles fein auf utf8 umgestellt (Dateiformat, .htaccess Anweisung, DB, Verbindung zwischen DB und Client,...). Heißt das, ich muss meine Codezeile jetzt auch irgendwie mit Multibyte Befehlen schreiben?

                            Nur wenn du Funktionen verwenden willst, die sonst nur für Ein-Byte-Kodierungen ausgelegt sind. Preg_* hat ja seine eigene UTF-8-Behandlung eingebaut.

                            Lo!

                2. Hi!

                  Also im Prinzip ähnelt REGEXP ja dem LIKE (wenn ich das richtig verstanden habe.

                  Ja, ist aber mächtiger, weil es nicht nur zwei Jokerzeichen kennt.

                  Also ich kann zwar mit den regulären Ausdrücken festlegen, nach was er suchen soll (und mit /b$q zum Beispiel, dass $q am Wortanfang stehen muss),

                  Das \b wie Word boundary kennt MySQL nicht, weil es nicht die Perl- sondern die POSIX-Syntax verwendet. Du müsstest schon [[:<:]], [[:>:]] dafür verwenden.

                  aber Selected wird doch trotzdem die gesamte Spalte... Ich will aber nur das Wort als Aussgabewert.

                  Das geht leider mit MySQL nicht, weil Regexp nur zum Suchen, nicht aber zu Stringbearbeiten verwendet werden können. Also gehen wird das prinzipiell schon mit genügend Aufwand und als selbst geschriebene Funktion. Einfacher ist es, mit PHP noch einmal einen Regexp auf das Ergebnis anzuwenden. (Hier solltest du dann aber doch mit den Perl-kompatiblen Fuktionen arbeiten.)

                  Lo!

              2. $query = mysql_query("SELECT DISTINCT ".$search_column." FROM ".$db_sub_table." WHERE ".$search_column." LIKE '".$search_part."' ");

                einbauen, damit er mir nur das eine zutreffende Wort ausspuckt?

                Deshalb sollte ein SQL Problem mit einem SQL Befehl dargestellt werden ;). Weil man hier alles Interpretieren kann.

                SELECT DISTINCT * FROM table WHERE desc LIKE '% even%';

                Wenn ich die Zeile beispielsweise um REGEXP '[[:<:]]".$q."' erweitere ändert sich an der Ausgabe überhaupt nichts.

                bedeutet?
                a) SELECT DISTINCT * FROM table WHERE desc LIKE '% even%' REGEXP '[[:<:]]even';
                b) SELECT DISTINCT * FROM table WHERE desc LIKE 'even' REGEXP '[[:<:]]even';
                c) SELECT DISTINCT * FROM table WHERE desc LIKE REGEXP '[[:<:]]even';
                d) SELECT DISTINCT * FROM table WHERE desc REGEXP '[[:<:]]even';
                Ich hoffe du siehst wo ich hinauswill?

                Kann mir nicht jemand die Zeile um den einen Befehl erweitern, der nätig ist? Ich lerne nun mal am Besten von funktionierenden Ergebnissen, wenn ich sie mir wieder rückwärts aufschlüssele.

                Oder du verräst was du meacht hast. Dann kann man dir auch helfen.
                Aber du hast es geschafft den richtigen RegExp zusammen zu bauen und das hab ich für den schweren Teil gehalten. Ich kannte die Möglichkeit bis eben auch nicht, jedoch sollte der Einbau in den SQL String ein leichtes sein. Bei mir geht es zuministens.

                1. Wenn ich die Zeile beispielsweise um REGEXP '[[:<:]]".$q."' erweitere ändert sich an der Ausgabe überhaupt nichts.
                  bedeutet?
                  a) SELECT DISTINCT * FROM table WHERE desc LIKE '% even%' REGEXP '[[:<:]]even';
                  b) SELECT DISTINCT * FROM table WHERE desc LIKE 'even' REGEXP '[[:<:]]even';
                  c) SELECT DISTINCT * FROM table WHERE desc LIKE REGEXP '[[:<:]]even';
                  d) SELECT DISTINCT * FROM table WHERE desc REGEXP '[[:<:]]even';
                  Ich hoffe du siehst wo ich hinauswill?

                  Naja, "erweitert" eben. Also angehängt. Nichts gelöscht. In diesem Fall a)

                  Aber du hast es geschafft den richtigen RegExp zusammen zu bauen und das hab ich für den schweren Teil gehalten. Ich kannte die Möglichkeit bis eben auch nicht, jedoch sollte der Einbau in den SQL String ein leichtes sein. Bei mir geht es zuministens.

                  Erstmal Danke :-)

                  Also:
                  imho ersetzt REGEXP einfach nur LIKE, also gibt das Suchdesign an. Das hat aber ja für mich auch alles Wunderbar mit LIKE funktioniert, und die beiden Suchen durch eine zu ersetzen war nicht mein Ziel (auch wenns natürlich toll ist). Mein Problem besteht aber weiterhin:
                  Er findet zwar die richtigen Zellen in der DB, aber spuckt immernoch die KOMPLETTE Zelle aus. Soll er aber nicht.

                  Wenn in der Zelle "ich stehe hier" steht und ich nach "steh" suche, dann kommt als Ergebnis "ich stehe hier", unabhängig davon, ob ich das jetzt mit REGEXP oder mit mit LIKE mache.
                  ich will aber bei der Suche nach "steh" als Ergebnis "stehe" bekommen.

                  Seh ich das jetzt wenigstens richtig, dass für dieses Anliegen REGEXP unwesentlich ist (da die Suche der richtigen Zelle ja schon mit LIKE funktioniert hat)?

                  Und sehe ich weiterhin richtig, dass (wie bereits zu Beginn vermutet) mein Anliegen nicht durch die Erweiterung des SQL-Befehls gelöst wird, sondern mit irgendeiner Funktion mit PHP, nachdem die Zelle der DB ausgelesen wurde?

                  Gruß
                  Bert