Christian Bliß: MySQL + Perl + Suchabfrage

Hallo,

habe ein Problem mit einer Suchabfrage in MySQL über Perl:

Ich möchte eine UND-Suche realisieren, also ALLE eingegebenen Suchbegriffe müssen enthalten sein, damit die Zeile ausgewählt wird:

Hier ein Teil des Perl-Codes
---------------------------------------------------
$such_text = "suchbegriff1 suchbegriff2";

@suche = split(/ /, $such_text);

foreach (@suche) {
  $q = "SELECT * FROM tabelle WHERE name ?????";
}

$sth = $dbh->prepare($q);
$anzahl = $sth->execute;
---------------------------------------------------

was muss ich eingeben, damit eine UND-Suchabfrage herauskommt? Es wird nur die Spalte 'namen' wird durchsucht.

MfG Christian Bliß

  1. Hallo,

    Ich möchte eine UND-Suche realisieren, also ALLE eingegebenen Suchbegriffe müssen enthalten sein, damit die Zeile ausgewählt wird:

    Du bist zu ungenau in der Formulierung Deines Problems:
    Willst Du, dass alle Datensätze ermittelt werden, bei denen das Feld 'name' den Wert 'suchbegriff1' oder alternativ den Wert 'suchbegriff2' hat?

    Oder willst Du, dass im Feld 'name' die beiden Strings 'suchbegriff1' und 'suchbegriff2' als Teil des Wertes gleichzeitig vorkommen?

    Grüße
      Klaus

  2. Hallo,

    es sollen alle Datensätze ermittelt werden, die alle eingegeben Suchbegriffe enthalten.

    z.B. Suchebegriffe: eins zwei drei vier fünf

    Gefunden werden sollen nur Zeilen, die ALLE Suchbegriffe enthalten, also "eins", "zwei", "drei", "vier", "fünf" müssen in 'namen' vorkommen. Sollte beispielsweise "drei" nicht vorkommen, soll die Zeile nicht gefunden werden.

    MfG Christian Bliß

    1. Hi,

      z.B. Suchebegriffe: eins zwei drei vier fünf

      Gefunden werden sollen nur Zeilen, die ALLE Suchbegriffe enthalten, also "eins", "zwei", "drei", "vier", "fünf" müssen in 'namen' vorkommen. Sollte beispielsweise "drei" nicht vorkommen, soll die Zeile nicht gefunden werden.

      Dann muss Deine where Bedingung so aussehen:

      where name like '%eins%' and name like '%zwei%' and name like '%drei%' ......

      damit dürfte es klappen.
      Versuche jedoch auf derarte like Abfragen zu verzichten.
      Diese fordern einieges an Performance das die Datenbank jeden String durchsuchen muss.

      Gruss Matze

  3. Hi Christian,

    das mit dem UND ist eine der gängigsten "Anfänger" Denkfehler.
    Das was Du vermutlich mit Und meinst heisst in Wirklichkeit oder.

    Nur als Beispiel: Wenn Du nach etwas suchst, dass beiden Kriterien entsprechen kann, dann wirst Du umgangsprachlich sagen:
    Das muss dem und dem entsprechen.
    Mathematisch jedoch heisst es richtig es muss dem oder dem entsprechen.

    Mit dieser kleine exkursion komme ich nun zurück zu Deiner Frage.

    Das muss nun wie folg heissen:

    foreach (@suche) {
      $q = "SELECT * FROM tabelle WHERE name ?????";
    }

    $q = "SELECT * FROM tabelle WHERE name='suchbegriff1' or name='suchbegriff2'";

    Mit dieser Abfrage bekommst Du nun alle Beiträge, die entweder dem suchbegriff1 oder suchbgriff2 entsprechen.
    Wenn jedoch beide Kriterien erfüllt sein müssen, also Suchbegriff1 und Schbegriff2 enthalten sein muss, dann musst Du mit and anstatt or beide where Bedingungen verknüpfen.

    Da ich nicht weiss was in dem Datenfeld steht, und dort eventuell nach einem Schlüsselwort gesucht wird, kannst Du auch folgendes versuchen.

    $q = "SELECT * FROM tabelle WHERE name like '%suchbegriff1%' or name like '%suchbegriff2%'";

    Dann wid alles gefunden, wo Dein Schlüsselwort bzw. Dein Suchbegriff enthalten ist.

    Das ist dann sinnvoll, wenn Du z.B. nach BMW suchst und im Namen folgendes stünde.

    MucBMWSoftlab
    Autohaus BMW Bavaria

    Gruss Matze