Kleines Problem mit einem Suchfilter (LEFT JOIN)

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

  • Kleines Problem mit einem Suchfilter (LEFT JOIN)

    Hallo zusammen,

    ich habe hier ein kleines Problem mit einem Suchfilter, welcher nur suboptimal funktioniert. Ich habe eine Projektbezogene Bilddatenbank erstellt. In deser gibt es die Möglichkeit, Bilder nach spezifischen Kriterien zu filtern. Es funktionieren eigentlich auch alle Filter. Bei der SUche nach Schlüsselwürtern gibt es aber noch ein keines Problem. Wenn ich nur einen Schlüsselwort Filter verwende, klappts problemlos. Suche ich jedoch noch nach einem zweiten Schlüsselwort, dann wirds nichts mehr.

    EDIT: Ich arbeite mit MySQL 6.0

    Meiner Funktion wird ein Array mit den abzufragenden BildIDs mirgegeben. Hier mal eine Beispielabrrage welche genereirt wird, wenn der User nach zwei Schlüsselwörtern sucht ohne dabei weitere Filter zu verwenden.

    PHP-Code:
    SELECT imagesdb_images.imageID FROM imagesdb_images 
    LEFT JOIN imagesdb_connections ON imagesdb_images
    .imageID imagesdb_connections.destination 
    LEFT JOIN imagesdb_project ON imagesdb_images
    .projektID imagesdb_project.projectID 
    LEFT JOIN imagesdb_locations ON imagesdb_project
    .locationID imagesdb_locations.locationID 
    WHERE 
    (imagesdb_bilder.imageID=462 OR imagesdb_images.imageID=463 OR ....) 
    AND (
    imagesdb_images.imageID 
    imagesdb_connections.destination AND imagesdb_connections.source =OR imagesdb_images.imageDescription LIKE "%Brot%"
    AND (
    imagesdb_images.imageID 
    imagesdb_connections.destination AND imagesdb_connections.source =OR imagesdb_images.imageDescription LIKE "%Wasser%"
    Hier die für die Abpfrage relevanten Tabellen:

    imagesdb_connections:

    Feld | Typ | NULL
    -------------------------------
    source | int(50) | NO |
    destination | int(50) | NO |
    type | varchar(50) | NO |


    Beispiel Datensatz: Source=1 (KeywordID), Destination=462 (ImageID) type="keyword" (Beziehungstyp)
    In dieser Tabelle wird definiert, welche Schlüsselwörter mit welchen bildern in Verbindung stehen.

    imagesdb_keywords:

    | Feld | Typ |NULL |Attr| Extra |
    -----------------------------------------
    | wordID | int(50) | NO | PRI |auto_increment |
    | word | varchar(100) | YES | | |



    imagesdb_images:

    | Feld | Typ |NULL |Attr| Extra
    ------------------------------------------
    | imageID | int(10) unsigned | NO | PRI | NULL | auto_increment |

    | imageName | varchar(20) | YES |

    | imagePath | int(50) | YES |

    | imageDescription | varchar(300) | YES |

    | projectID | int(10) | YES |

    | categoryID | int(11) | YES |

    | DateInserted | varchar(50) | YES |

    | DateUpdated | varchar(50) | YES |



    Meine Erfahrunf mit komplexeren Abfragen lässt halt ein wenig zu wünschen übrig. Aber es kommt ja auch nicht alles von heute auf morgen.

    Ich hoffe ihr könnt mir helfen.

    Grüsse und danke
    Luki
    Zuletzt geändert von Luki; 18.03.2009, 18:35.

  • #2
    Code:
    (imagesdb_images.imageID =  imagesdb_connections.destination AND imagesdb_connections.source =3 OR 
    imagesdb_images.imageDescription LIKE "%Brot%")  
    AND (imagesdb_images.imageID =  imagesdb_connections.destination AND imagesdb_connections.source =1 OR 
    imagesdb_images.imageDescription LIKE "%Wasser%")
    Versuche erstmal dies mit einem OR und nicht mit einem AND zu verknüpfen. Denn du willst ja nicht Wasser UND Brot in deinem Suchergebnis haben oder? Weil dann wäre das mit der source schon wieder komisch.

    Zur übersichtlichkeit würde ich ausserdem Aliasse verwenden.

    und:


    Code:
    (imagesdb_bilder.imageID=462 OR imagesdb_images.imageID=463 OR ....)
    Viel hübscher wäre:

    Code:
    (B.imageID= IN (462, 463 [...])
    EDIT:
    zeilenumbrüche sponsored by kropff
    Zuletzt geändert von Kropff; 18.03.2009, 19:01.
    signed oder unsigned... das ist hier die Frage

    Kommentar


    • #3
      Hallo Case,

      danke schon mal für die Antwort. Mit dem OR klappts. Allerdings sind z.T. pro Bild um die 50 Schlüsselwörter definiert. Es sollen also weirklich nur die Bilder gefunden werden, fü welche beide Schlüsselwörter definiert sind.

      Viel hübscher wäre:
      Code:
      (B.imageID= IN (462, 463 [...])
      Da hast du eindeutig recht Werde den Query so anpassen.

      Kommentar


      • #4
        Du solltest dir das Result-Set mal ohne WHERE-Bedingung anschauen und dann mal überlegen, ob das mit dem AND so überhaupt klappen kann.

        Wenn dir dann klar geworden ist, warum das so nicht klappen kannst, fallen mir spontan folgende Möglichkeiten ein:
        1. Pro Suchwort einen Join auf die Tabelle + group by + having COUNT() = Anzahl der Suchworte
        2. Ein Join, GROUP_CONCAT auf Such-Wort, where FIND_IN_SET(suchwort_n,group_concat)*Anzahl der Suchworte

        wobei ich mir nicht sicher bin, ob letzteres auch wirklich funktioniert...

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Ja es kam mir schon die ganze Zeit etwas komisch vor. Aber wie gesagt, meine EWrfahrung mit komplexeren Abbragen hält sich in Grenzen. Ist für mich schon ein vorstossen in neue Welten, dass sämtliche Filtermöglichkeiten mit einem einzigen Query funktionieren

          Nun ok.. Ich versuch mich da mal rein zu arbeiten. Warum konnte ich auch ausgerechnet heute Nacht nicht schlafen. In totaler Müdigkeit ists richtig mühsahm zu experimentieren

          Nun Danke mal für die Antwort. Dann halt ich mich da mal ran und geb Bescheid.

          Kommentar


          • #6
            So, ich habs jetz. Danke noch ghost für deinen Anstoss. ich habe nun zwar nicht deine Lösung genommen. bzw, ich habs versucht, aber irgendwie in der super Müdigkeit nicht recht geschnallt. Es wäre vielelicht noch so weit gekommen.. allerdings habe ich während dem probieren was anderes entdeckt. Ich wusste bisher nicht, dass ich in einem Query noch einen weiteren Query verwenden kann. Da schon mal schön was gelernt.

            Morgen wenn ich etwas wacher bin, setze ich mich aber nochmals mit deinem Lösungsvorschlag auseinander. Einfach zwecks dessen, dass ichs nachher verstehe. Schliesslich arbeite ich ja die ganze Zeit mit PHP/MySQL. Daher ist der Ausbau des Verständnisses sowieso Pflicht

            Nun, sollte es wen interessieren, wie ich es nun gelöst habe. Hier ein Beispielquery mit drei Schlagwörtern.

            PHP-Code:
            SELECT imageID FROM imagesdb_images p 
            LEFT JOIN imagesdb_project pr ON p
            .projectID pr.projectID 
            LEFT JOIN imagesdb_locations o ON pr
            .locationD o.locationD 
            WHERE p
            .imageID IN (462463464465466467468469470471 [...] ) 
            AND (
            p.imageID in (SELECT destination from imagesdb_connections where source=3 GROUP BY destination
            OR 
            p.imageDescription LIKE "%Wasser%"
            AND (
            p.imageID in (SELECT destination from imagesdb_connections where source=19 GROUP BY destination
            OR 
            p.imageDescription LIKE "%Loft%"
            AND (
            p.imageID in (SELECT destination from imagesdb_connections where source=43 GROUP BY destination
            OR 
            p.imageDescription LIKE "%fritz%"

            Kommentar


            • #7
              Subselects sind in MySQL übrigens potentiell eher böse und langsam~

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Ok. Aber immerhin funktioniert es jetz mal temporär. Ich setze mich dann wie gesagt noch weiter mit deinem Vorschlag auseinander. Dann kann ichs dann noch nachbessern.

                Kommentar

                Lädt...
                X