Texter mit x: Platzhalter in mysql Datenbank, nicht in der Datenbankabfrage

Hallo,

ich habe schon eine Weile gesucht, aber ich finde nur das "%" und den "_" als Platzhalter bei einer Datenbankabfrage.

Was ich suche ist sozusagen ein Platzhalter, den man speichern kann. Ein Beispiel:
Ich will "Die Antwort lautet %" in der Datenbank speichern und der Eintrag soll bei jeder Abfrage die mit "Die Antwort lautet" beginnt gefunden werden.

Da ich schon vermute, daß es so was nicht gibt, wie könnte man das sonst realisieren?

Ich vermute, man könnte es mit einer "unscharfen" Volltext-Suche und einer anschließenden Verarbeitung mit php machen aber falls es einen besseren direkteren Weg gibt, würde ich den vorziehen.

  1. Hi,

    ich habe schon eine Weile gesucht, aber ich finde nur das "%" und den "_" als Platzhalter bei einer Datenbankabfrage.

    ähm, wenn Du eine Datenbank abfragen möchtest, dürfte es sich anbieten, etwas in einer Datenbankabfrage zu finden.

    Was ich suche ist sozusagen ein Platzhalter, den man speichern kann.

    SQL kennt in Abfragen mit dem LIKE-Operator die Platzhalter "%" und "_". Sie müssen sich in dem Wert befinden, der rechts des Operators steht. Wo der Wert herkommt, ist dem DBMS gepflegt egal - es unterscheidet da nicht.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. ähm, wenn Du eine Datenbank abfragen möchtest, dürfte es sich anbieten, etwas in einer Datenbankabfrage zu finden.

      Ähm, genau oder zu erfahren, daß es nichts zu finden gibt.

      Wenn ich aber nach "Die Antwort lautet Affe." suche, ohne daß ich vorher wußte, daß ich mal danach suchen wollen würde und in der Datenbank steht "Die Antwort lautet >ominöser Platzhalter<", ohne daß ich weiß, ob so was in der Datenbank steht, dann nützt mir LIKE *** % nichts, weil ich nicht weiß was ich statt *** nehmen muß.

      Ich könnte jetzt nach LIKE "D%" suchen und schauen, ob das Gefunden abzüglich des ominösen Platzhalters ein Teilstring des Suchstrings ist aber so wollte ich wenn's geht nicht vorgehen.

      1. echo $begrüßung;

        Wenn ich aber nach "Die Antwort lautet Affe." suche, ohne daß ich vorher wußte, daß ich mal danach suchen wollen würde und in der Datenbank steht "Die Antwort lautet >ominöser Platzhalter<", ohne daß ich weiß, ob so was in der Datenbank steht, dann nützt mir LIKE *** % nichts, weil ich nicht weiß was ich statt *** nehmen muß.

        Ich könnte jetzt nach LIKE "D%" suchen und schauen, ob das Gefunden abzüglich des ominösen Platzhalters ein Teilstring des Suchstrings ist aber so wollte ich wenn's geht nicht vorgehen.

        Nochmal zum Mitschreiben. In deiner Datenbank steht "Die Antwort lautet %." Du möchtest genau diesen Datensatz finden, wenn du nach "Die Antwort lautet Affe." oder auch "Die Antwort lautet Texter mit x." suchst? Wenn ja, dann nimm LIKE und vertausch die Operanden:

        ... WHERE "Die Antwort lautet Affe." LIKE spalte_mit_platzhalter

        oder

        ... WHERE "Die Antwort lautet Texter mit x." LIKE spalte_mit_platzhalter

        echo "$verabschiedung $name";

        1. Wenn ja, dann nimm LIKE und vertausch die Operanden:

          *g* So einfach, ich muß nur noch den Platzhalter weglassen.

          Auf die Idee wäre ich vielleicht nie gekommen. Ohne darüber nachzudenken, habe ich wohl unterbewußt ausgeschlossen, daß man die Operanten vertauschen kann/darf.

          Vielen Dank.

          1. ... ich muß nur noch den Platzhalter weglassen.

            Was Quatsch ist, da ich das "%" natürlich nicht an den Spaltennamen dranhängen kann. Das "%" muß in den Datenbankeintrag.

            1. Hi,

              Was Quatsch ist, da ich das "%" natürlich nicht an den Spaltennamen dranhängen kann.

              nein, aber an den aus der Spalte ausgelesenen Wert.

              Das "%" muß in den Datenbankeintrag.

              Nicht zwingend.

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
              1. Was Quatsch ist, da ich das "%" natürlich nicht an den Spaltennamen dranhängen kann.

                nein, aber an den aus der Spalte ausgelesenen Wert.

                Nach wiederholter Suche habe ich CONCAT() gefunden. Ich muß meine Vorstellung von dem was mysql kann/ermöglicht revidieren.

                Ich hätte aber auch gedacht, daß CONCAT( eingabe , '%' ) das "%" an den Spaltennamen anhängt. Bisher habe ich Anführungszeichen um Spaltennamen immer weggelassen und wenn, dann hätte ich sicher die falschen genommen.

                Die Abfrage mit
                WHERE 'Die Antwort lautet Affe' LIKE CONCAT( eingabe , '%' )
                liefert aber außer "Die Antwort lautet" auch noch Einträge, die nur aus einem "d" oder "die Antwort" bestehen zurück. Diese Einträge sollten nicht matchen. Da müßte ich noch eine Spalte mit einem Flag vorsehen, um zu bestimmen, welche Einträge bei dieser Art der Abfrage einbezogen werden sollen.

                1. Hi,

                  Nach wiederholter Suche habe ich CONCAT() gefunden. Ich muß meine Vorstellung von dem was mysql kann/ermöglicht revidieren.

                  dies sehe ich als Erfolg an.

                  Ich hätte aber auch gedacht, daß CONCAT( eingabe , '%' ) das "%" an den Spaltennamen anhängt. Bisher habe ich Anführungszeichen um Spaltennamen immer weggelassen und wenn, dann hätte ich sicher die falschen genommen.

                  Die, die Du hier nimmst, sind ebenfalls falsch - in dem Sinne, dass sie absolut überflüssig sind. Durch die Backticks kannst Du MySQL dazu bewegen, auch ungünstige Zeichenkombinationen als Spalten- oder Tabellennamen zu interpretieren, jedoch ist das stets ein Indiz dafür, dass Deine Benamsung ungünstig ist; außerdem ist an "eingabe" nichts, was irgendwie kritisch wäre.

                  Die Abfrage mit
                  WHERE 'Die Antwort lautet Affe' LIKE CONCAT( eingabe , '%' )
                  liefert aber außer "Die Antwort lautet" auch noch Einträge, die nur aus einem "d" oder "die Antwort" bestehen zurück. Diese Einträge sollten nicht matchen. Da müßte ich noch eine Spalte mit einem Flag vorsehen, um zu bestimmen, welche Einträge bei dieser Art der Abfrage einbezogen werden sollen.

                  Wenn es innerhalb der Spalte unterschiede gibt, wie sie zu bewerten gibt, musst Du in der Tat eine Lösung finden. Du könntest beispielsweise

                  • ein Flag setzen, wie von Dir vorgeschlagen;
                  • das '%' in den Spaltenwert aufnehmen, wie ursprünglich vorgesehen;
                  • statt nur einer zwei Spalten einsetzen, von denen eine den exakten Match und die andere ein Pattern Matching aufnimmt.

                  Cheatah

                  --
                  X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                  X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                  X-Will-Answer-Email: No
                  X-Please-Search-Archive-First: Absolutely Yes
                  1. Ich hätte aber auch gedacht, daß CONCAT( eingabe , '%' ) das "%" an den Spaltennamen anhängt. Bisher habe ich Anführungszeichen um Spaltennamen immer weggelassen und wenn, dann hätte ich sicher die falschen genommen.

                    Die, die Du hier nimmst, sind ebenfalls falsch - in dem Sinne, dass sie absolut überflüssig sind. Durch die Backticks kannst Du MySQL dazu bewegen, auch ungünstige Zeichenkombinationen als Spalten- oder Tabellennamen zu interpretieren, jedoch ist das stets ein Indiz dafür, dass Deine Benamsung ungünstig ist; außerdem ist an "eingabe" nichts, was irgendwie kritisch wäre.

                    Ich hatte eine Suchabfrage von phpMyAdmin modifiziert und dort wieder ausgeführt (sonst wäre ich nicht auf die Backticks gekommen). Die Abfrage ohne die Backticks lieferte dabei keinen Treffer (der Spaltenname ist das unkritische "eingabe"). Es kann aber sein, daß ich einen anderen Fehler eingebaut hatte.

                    Wenn es innerhalb der Spalte unterschiede gibt, wie sie zu bewerten gibt, musst Du in der Tat eine Lösung finden. Du könntest beispielsweise

                    • ein Flag setzen, wie von Dir vorgeschlagen;
                    • das '%' in den Spaltenwert aufnehmen, wie ursprünglich vorgesehen;

                    Ich werde beides einsetzen, dann kann der Platzhalter nicht nur am Anfang oder Ende stehen, ungewollte Treffer werden unterbunden und die Abfrage kann effizienter gestaltet werden. Das Ganze mit nur geringfügig mehr Speicherbedarf.

                    Danke auch Dir