Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Query mit LIKE und mit =

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Query mit LIKE und mit =

    Hi Leutz,

    ich möchte meine Query so umschreiben, dass an Stelle von LIKE ein = fungiert.

    Die Query welche ich umformen möchte, sieht folgender Maßen aus:

    PHP-Code:
    $suchwort_array explode(" "$suchwort); 

    $query 'SELECT DISTINCT * FROM tabelle WHERE '

    for(
    $i=0$i count($suchwort_array); $i++) 

    $query .= "(MATCH (Title,ShortDescription,LongDescription,Category,Brand) AGAINST('%" mysql_real_escape_string($suchwort_array[$i]) . "%') AND Brand LIKE '%" mysql_real_escape_string($brand) . "%')"

    if(
    $i<count($suchwort_array)-1)
    {
    $query .= ' and ';  
    }
    }
    $result mysql_query($query); 
    Das echo hierzu:
    SELECT DISTINCT * FROM Tabelle WHERE (MATCH (Title,ShortDescription,LongDescription,Category,B rand) AGAINST('%schuhe%') AND Brand LIKE '%%')

    So bald ich aus dem LIKE ein = mache und dabei die %-Zeichen weg lasse, habe ich das Problem das wenn ein User bei seiner Suche das Feld "Brand" auslässt, meine SUMA nur nach Datensätze sucht bei denen das Feld "Brand" in meiner MySQL-Tabelle leer ist.

    Bsp.: Der User tippt in das Suchfeld den Begriff Schuhe ein und lässt das Sprungmenü (Brand) bei seiner Suche aus, weil ihm die Marke egal ist.
    Die Suma spuckt dann aber nur Datensätze bzw. Schuhe aus, die über keine Marke verfügen.

    ...und meine Explode-Funktion funzt dabei auch nicht mehr.

    Hier die Query:
    PHP-Code:
    $suchwort_array explode(" "$suchwort); 

    $query 'SELECT DISTINCT * FROM Tabelle WHERE '

    for(
    $i=0$i count($suchwort_array); $i++) 

    $query .= "(MATCH (Title,ShortDescription,LongDescription,Category,Brand) AGAINST('%" mysql_real_escape_string($suchwort_array[$i]) . "%') AND Brand = '" mysql_real_escape_string($brand) . "')";

    if(
    $i<count($suchwort_array)-1)
    {
    $query .= ' and ';  
    }
    }
    $result mysql_query($query); 
    Im Grunde genommen lautet meine Frage, wie ich an Stelle von LIKE ein = setzen kann, ohne dass sich die Suchfunktion ändert.


  • #2
    ...Oder anders gefragt:

    Kann ich das LIKE in meiner Query aus performanc-Gründen so stehen lassen, da es sich ja nur um EINE Spalte in meiner MySQL-Tabelle handelt, die es zu durchsuchen gilt (Marke).

    Viele haben mir von LIKE abgeraten. Zwecks Serverkill!!! Bei meiner Datenbank handelt es sich um ca. 500.000 einzelne Datensätze.

    Wie ist Eure Meinung dazu?

    Kommentar


    • #3
      Zitat von bench78 Beitrag anzeigen
      So bald ich aus dem LIKE ein = mache und dabei die %-Zeichen weg lasse, habe ich das Problem das wenn ein User bei seiner Suche das Feld "Brand" auslässt, meine SUMA nur nach Datensätze sucht bei denen das Feld "Brand" in meiner MySQL-Tabelle leer ist.
      Dann lasse den Abfrageteil, der die Spalte Brand vergleicht, ganz aus der Query heraus, wenn der Nutzer in das zugehörige Formularfeld nichts eingegeben hat.


      Btw., dein Vorgehen ist sowieso irgendwie unsinnig - denn wenn $suchwort_array mehrere Wörter enthält, dann hängst du den jedes mal gleichen Vergleich für die Spalte Brand für jedes Suchwort noch mal neu an. (Wenn du dir die generierte Query für mehrere Suchwörter mal hättest ausgeben lassen, hätte dir das eigentlich auffallen sollen!)

      Und auch für jedes einzelne Suchwort ein eigenes MATCH ... AGAINST auf exakt die gleichen Spalten anzuhängen, ist nicht im Sinne des Erfinders;
      sondern eher Konstrukte wie MATCH(...) AGAINST("haus baum auto").


      Zu der nachgeschobenen Performance-Frage: In seiner derzeitigen Form dürfte das das ungünstigste überhaupt sein.
      Lies mal im Manual nach, wie Volltextsuche unter MySQL funktioniert und gedacht ist.

      Kommentar


      • #4
        Dann lasse den Abfrageteil, der die Spalte Brand vergleicht, ganz aus der Query heraus, wenn der Nutzer in das zugehörige Formularfeld nichts eingegeben hat.
        Also per IF-Bedingung?


        Btw., dein Vorgehen ist sowieso irgendwie unsinnig - denn wenn $suchwort_array mehrere Wörter enthält, dann hängst du den jedes mal gleichen Vergleich für die Spalte Brand für jedes Suchwort noch mal neu an. (Wenn du dir die generierte Query für mehrere Suchwörter mal hättest ausgeben lassen, hätte dir das eigentlich auffallen sollen!)
        Klar, ist mir aufgefallen. Der Zweck meiner Explode-Funktion liegt darin, dass wenn der User z. B. "Schuhe grün" sucht, ihm auch ausschließlich alle grünen Schuhe und nichts weiteres was mit Grün oder Schuhe zu tun hat angezeigt werden soll.

        Kommentar


        • #5
          @ChrisB VERY BIG THX!
          Dann lasse den Abfrageteil, der die Spalte Brand vergleicht, ganz aus der Query heraus, wenn der Nutzer in das zugehörige Formularfeld nichts eingegeben hat.
          Also per IF-Bedingung?
          Vielen Dank für den Hinweis. Ich habe die Query per IF bedingt. Und es funzt wie gewünscht. Auch mit dem = Zeichen anstelle für LIKE.

          ECHO sieht jetzt so aus:

          SELECT DISTINCT * FROM Tabelle WHERE MATCH (Title,ShortDescription,Category,LongDescription,B rand) AGAINST('%schuhe%') and MATCH (Title,ShortDescription,Category,LongDescription,B rand) AGAINST('%grün%') AND Brand = 'Lacoste' LIMIT 0,10

          Thread lasse ich vorerst als unerledigt stehen, falls sich neue Probs aufmachen.

          Kommentar

          Lädt...
          X