Benötige Hilfe bei komplexer SQL Abfrage für Filter

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

  • Benötige Hilfe bei komplexer SQL Abfrage für Filter

    Hallo,

    ich habe ein Formular, über das ich zuvor zugeordnete Einträge aus der Datenbank gefiltert ausgeben möchte.

    Das Formular hat folgenden Aufbau.
    ---------------------------
    1. Frau oder Mann?
    ---------------------------
    2. Alter wie z.b. 10, 20, 30, 40, 50
    ---------------------------
    3. Viele verschiedene Vorlieben wie Essen, Trinken, Feiern, Reisen, Sport
    ---------------------------
    4. Beziehung: Freunde, Familie, Bekannte
    ---------------------------

    Das Formular besteht aus checkboxen, von denen ich beliebig viele Auswählen kann und in beliebiger Reihenfolge.

    Ich habe in der Datenbank Produkte hinterlegt, die in einer Tabelle den jeweiligen Kategorien zugeordnet sind.

    Ein Produkt ist z.B. nur für Männer, 20 Jahre, Hat etwas mit Sport und Reisen zu tun und nur für Freunde.

    Wenn ich aber jetzt z.B. "Männer" und 10 jahre wähle, bekomme ich das gleiche Produkt angezeigt, da es auch für die Kategorie 1 "Männer" zugeordnet wurde obwohl es vom alter nicht mehr passt.

    Wie löse ich das Problem, das die einzelnen Gruppen und die abhängigkeit der Kategorien berücksichtigt werden?

    Mein Ansatz ist so, ich bekomme aber immer 0 zeilen Raus obwohl es ein Produkt gibt das passen muss.

    PHP-Code:
    SELECT products.* FROM products 
    JOIN product_in_kategorie ON products
    .id product_in_kategorie.product_id
    JOIN kategorien ON product_in_kategorie
    .kategorie_id kategorien.id
    WHERE 
    (product_in_kategorie.kategorie_id IN (152334) AND kategorien.gruppe 1) AND 
    (
    product_in_kategorie.kategorie_id IN (152334)  AND kategorien.gruppe 2
     AND 
    (
    product_in_kategorie.kategorie_id IN (152334)  AND kategorien.gruppe 3)
     AND 
    (
    product_in_kategorie.kategorie_id IN (152334)  AND kategorien.gruppe 4)  LIMIT 20 
    Also ich will das die Abfrag folgendes kann z.B.

    Ich suche was für Frauen, im alter von 20 oder 30 Jahre, mit den Interessen Essen oder Feiern oder Reisen und Die Beziehung ist Freunschaft oder Familie.
    Dann sollen nur die Produkte ausgegeben werden, die genau zu diesen Kriterien passen und absolut nichts was nur für Männer zugeordnet wurde aber von alter her passt.

    Meine Überlegung war, das ganze in mehrere Abfragen zu teilen, so dass ich erst abfrage, ist es was für Männer oder Frauen oder ist es egal.. Danach den Rest usw..
    Das Problem bei dieser Vorgehensweise ist, das ich mit LIMIT 20 arbeite und eventuell gar nicht bis zu 3. oder 4. Abfrage komme, obwohl es noch genug ungeprüfte Einträge gäbe die wegen dem LIMIT nicht berücksichigt werden.
    Deswegen müsste alles in einer Abfrage gemacht werden.
    Zuletzt geändert von BananaJo; 12.02.2015, 00:51.

  • #2
    PHP-Code:
    WHERE 
    (product_in_kategorie.kategorie_id IN (152334) AND kategorien.gruppe 1) AND 
    (
    product_in_kategorie.kategorie_id IN (152334)  AND kategorien.gruppe 2
     AND [...] 
    Das funktioniert so selbstverständlich nicht, weil du hier verlangst, dass kategorien.gruppe gleichzeitig den Wert 1 und den Wert 2 haben soll – und solange du keinen Quantencomputer hast, wird das wohl kaum der Fall sein.

    Bevor wir das weiter diskutieren, beschreibst du aber bitte erst mal dein Datenmodell/Tabellenstrukturen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Tabelle 1 - products: Eine Tabelle mit allen Produkten.
      Tabelle 2 - kategorien: Kategorien mit Ids und Gruppen Nummern 1 - 4
      Tabelle 3 - product_in_kategorie: Je Produkt ein mehrere Datensätze, je nachdem in welcher Kateogire

      Kommentar


      • #4
        Sowas kann man mit HAVING umsetzen.

        Zuerst mal filterst du nach allen Datensätzen, die in einer der gesuchten Kategorien sind (also mit OR verknüpft, nicht mit dem – unmöglich erfüllbaren – AND), gruppierst diese nach dem Produkt – und verlangst dann mit HAVING, dass die Anzahl der gefundenen Datensätze je Produkt genau oder mindestens (= oder <, je nachdem, ob du nur Produkte haben haben willst, die ausschließlich in den gesuchten Kategorien sind, oder ob sie auch noch in anderen sein dürfen) der Anzahl deiner Suchbedingungen (vorher ermittelt, und als statischer Wert in die Query eingesetzt) entspricht.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar

        Lädt...
        X