peter 4454: MySQL Datenbank durchsuchen

Ich will mit diesem Query eine Tabelle nach den Begriffen durchsuchen:

  
SELECT starting_time, txt_title, txt_opener, id FROM articles WHERE ("txt_opener" LIKE "%gg%" AND "%jj%") OR ("txt_content" LIKE "%gg%" AND "%jj%") OR ("txt_title" LIKE "%gg%" AND "%jj%")  

Leider funktioniert es nicht so wie ich will. Wenn ich nur nach "e" oder "a" suche, bekomme ich ein Ergbnis, wenn ich nach einem Wort oder mehreren Wörtern suche, die sicher in Datensätzen vorkommen, bekomme ich kein Ergebnis...

Wo ist da mein Fehler?

  1. Hallo,

    Ich will mit diesem Query eine Tabelle nach den Begriffen durchsuchen:

    SELECT starting_time, txt_title, txt_opener, id FROM articles WHERE ("txt_opener" LIKE "%gg%" AND "%jj%") OR ("txt_content" LIKE "%gg%" AND "%jj%") OR ("txt_title" LIKE "%gg%" AND "%jj%")

      
    
    > Leider funktioniert es nicht so wie ich will. Wenn ich nur nach "e" oder "a" suche, bekomme ich ein Ergbnis, wenn ich nach einem Wort oder mehreren Wörtern suche, die sicher in Datensätzen vorkommen, bekomme ich kein Ergebnis...  
      
    ich weiß leider nicht, was Du willst.  
      
    Ich vermute Du möchtest die Datensätze haben, bei denen in mindestens einer der Spalten txt\_opener, txt\_content oder txt\_title sowohl der Text "gg" als auch der Text "jj" enthalten ist. Vermute ich richtig?  
      
    Wenn ja: Spaltennamen kannst Du nur dann in doppelte Anführungszeichen setzen, wenn der SQL-Modus [ANSI_QUOTES](http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_ansi_quotes) aktiviert ist. Ist das nicht der Fall (derzeit Standard), dann kannst Du  
      
    a) Spaltennamen, die nicht gequoted werden müssen, einfach nicht quoten  
    b) Spaltennamen so quoten, [wie MySQL es erwartet](http://dev.mysql.com/doc/refman/5.1/en/identifiers.html)  
      
    
    > Wo ist da mein Fehler?  
      
    Weiterhin kannst Du nicht einfach abkürzend schreiben:  
      
       `txt_opener LIKE '%gg%' AND '%jj%'`{:.language-sql}  
      
    sondern musst hübsch ordentlich zweimal prüfen:  
      
       `txt_opener LIKE '%gg%' AND txt_opener LIKE '%jj%'`{:.language-sql}  
      
    und das bei jedem Deiner Ausdrücke.  
      
    Ach ja: es ist in SQL eine sehr gute Idee, Zeichenketten \*immer\* in einfache Anführungszeichen zu setzen. Im bereits angeführten ANSI\_QUOTES-Modus werden doppelte nicht akzeptiert und viele andere Datenbankmanagementsysteme mögen sowieso keine doppelten Anführungszeichen um Zeichenketten. Deswegen gewöhnt man sich das am besten überhaupt gar nicht erst an und nutzt das, was alle \*immer\* verstehen: einfache Anführungszeichen.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Ich habe jetzt die Anführungszeichen umgewechselt. Wenn ich nur nach einem Wort suche, müsste der Query ja dann funktionieren (da dann gar kein AND in den Query kommt):

        
      SELECT starting_time, txt_title, txt_opener, id FROM articles WHERE ('txt_opener' LIKE '%Das%') OR ('txt_content' LIKE '%Das%') OR ('txt_title' LIKE '%Das%')  
      
      

      Leider findet das so gar nichts, wenn ich nur nach "a" suche dann schon.
      Wo ist da mein Fehler?

      Die Syntax habe ich von anderen Seiten.

      1. Lieber peter,

        WHERE ('txt_opener' LIKE '%Das%')

        stellst Du Dich dumm? Vinzenz hat das so schön erklärt...

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Lieber peter,

    meine MySQL-Kentnisse sind noch sehr jung und lückenhaft, aber könnte es sein, dass diese Bedingung von Dir missverstanden wird?

    WHERE ("txt_opener" LIKE "%gg%" AND "%jj%")

    Dein Statement (ja, dieser Ausschnitt) bedeutet nach meinem Verständnis
    'Datensätze für die gilt, dass "txt_opener" (ein String, keinesfalls ein Spaltenname!) ähnlich zu "%gg%" ist (es muss "gg" darin enthalten sein) und es muss "%jj%" auch noch erfüllt sein (was auch immer das sein soll).'

    Ich hätte jetzt zuersteinmal die Spaltennamen in Backticks eingeschlossen (z.B. txt\_opener anstatt "txt_opener") und die AND-Verknüpfung hätte ich nicht nur mit einem String, sondern mit einem echten zweiten Ausdruck mit LIKE-Operator versehen:

    WHERE (txt_openerLIKE "%gg%" ANDtxt_opener LIKE "%jj%")

    Wo ist da mein Fehler?

    Wenn Du mich fragst, dann waren das bereits gleich zwei auf einmal (in mehrfacher Ausführung). Führen meine Vorschläge bei Dir zu einer Lösung? Eine Antwort würde auch mir weiterhelfen, da ich in Sachen MySQL auch gerade erst lerne.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,

      meine MySQL-Kentnisse sind noch sehr jung und lückenhaft,

      das stimmt :-)

      aber könnte es sein, dass diese Bedingung von Dir missverstanden wird?

      WHERE ("txt_opener" LIKE "%gg%" AND "%jj%")

      das stimmt ebenfalls,

      Dein Statement (ja, dieser Ausschnitt) bedeutet nach meinem Verständnis
      'Datensätze für die gilt, dass "txt_opener" (ein String, keinesfalls ein Spaltenname!)

      das stimmt nicht (nicht immer),

      ähnlich zu "%gg%" ist (es muss "gg" darin enthalten sein)

      das kann stimmen oder auch nicht: es könnte auch bedeuten: Der Inhalt der Spalte txt_opener muss ähnlich zum Inhalt der Spalte %gg% sein.

      und es muss "%jj%" auch noch erfüllt sein (was auch immer das sein soll).'

      Entweder die Zeichenkette %jj% wird in einem boolschen Kontext ausgewertet und ist somit wahr oder es wird der Inhalt der Spalte %jj% ausgewertet, der wahr oder falsch sein kann. Vermutlich wird's die Spalten nicht geben und zu einer Fehlermeldung kommen ...

      Ich hätte jetzt zuersteinmal die Spaltennamen in Backticks eingeschlossen (z.B. txt\_opener anstatt "txt_opener") und die AND-Verknüpfung hätte ich nicht nur mit einem String, sondern mit einem echten zweiten Ausdruck mit LIKE-Operator versehen:

      Backtickitis ist eine üble MySQL-Krankheit :-(
      Man kann sie mit dem SQL-Modus ANSI_QUOTES heilen :-)

      Auch für Dich, Felix:
      Es ist eine gute Idee, in SQL Zeichenketten *ausschließlich* in einfache Anführungszeichen einzuschließen.

      In Beispielcode ist es eine sehr gute Idee, solche Spaltennamen zu verwenden, die nicht gequoted werden müssen - und sie auch nicht zu quoten.

      Bei generiertem Code ist es dagegen eine gute Idee, Schema Object Names grundsätzlich zu quoten - und dies einer Funktion zu überlassen, die dies für das verwendete DBMS richtig macht.

      Freundliche Grüße

      Vinzenz