2016-04-23 30 views
0

Ich brauche Produkte durch die Varianten Inhalte zu filtern, aber ich bin ganz fest, ist die Struktur die folgenden:MySql Filterabfrage zur Produktvariantentabelle

Ich habe diese drei Tabellen:

PRODUKT

______ _________ 
| id | title | 
|------|---------| 
| 1 | Shirt | 
| 2 | Hood | 

PRODUCT_VARIANT

______ ___________ 
| id | product | 
|------|-----------| 
| 1 | 1  | 
| 2 | 1  | 
| 3 | 2  | 

PRODUCT_VARIANT_CONTENT

______ ___________ __________ __________ 
| id | variant | option | content | 
|------|-----------|----------|----------| 
| 1 | 1  | 1  | small | 
| 2 | 1  | 2  | blue  | 
| 3 | 2  | 1  | small | 
| 4 | 2  | 3  | red  | 
| 5 | 3  | 1  | small | 

Ok ...
Also, wenn ich brauche alle Produkte zu erhalten, die rot ist, ich die folgende Abfrage ausführen:

SELECT 
    P.id, 
    P.`title`, 
    GROUP_CONCAT(PVC.content) AS content 
FROM 
    product P 
LEFT JOIN product_variant PV ON PV.product = P.id 
LEFT JOIN product_variant_content PVC ON PVC.variant = PV.id 
WHERE PVC.content = 'red' 
GROUP BY 
    P.id, PV.id 

Es wird zurück:

______ ___________ _________ 
| id | title | content | 
|------|---------|-----------| 
| 1 | Shirt | red  | 

Das ist OK, das Ergebnis, das ich erwartet habe, aber ich muss alle Produkte, die gleichzeitig klein und rot sind, bekommen, ich weiß nicht, wie ich das erreichen kann, kann mir jemand dabei helfen?

BEARBEITET! Ich habe die Lösung, wenn jemand diese Seite gelangen, ist das Problem gelöst wurde mit dieser Abfrage:

SELECT 
    P.id, 
    P.`name`, 
    PVC1.content, 
    PVC2.content 
FROM 
    product P 
JOIN product_variant PV ON PV.product = P.id 
JOIN product_variant_content PVC1 ON PVC1.variant = PV.id AND PVC1.content = 'red' 
JOIN product_variant_content PVC2 ON PVC2.variant = PV.id AND PVC2.content = 'small' 

GROUP BY 
    P.id, PV.id 
+1

Oh die Freuden des Schreibens von SQL, um mit einem EAV-Modell zu arbeiten ... was in einem relationalen Modell trivial wäre, wird um eine Größenordnung schwieriger gemacht. – spencer7593

+0

Sie können für jeden Inhaltswert einen separaten Join-Pfad verwenden. Zwei Verbindungen zu PRODUCT_VARIANT_COLUMN, eine für "rot", die andere für "klein". Dieselbe Frage wurde schon mehrfach bei StackOverflow gestellt. – spencer7593

+0

Mögliches Duplikat: http://stackoverflow.com/questions/12269135/mysql-eav-match-row-as-field-or-entitys-property-value Um weitere Fragen zu SQL bezüglich des EAV-Modells zu erhalten, fügen Sie das Tag ein Entity-Attribut-Wert in Ihrer Suche. – spencer7593

Antwort

0

Wenn ich richtig verstehe, wird dies durch eine AND-Klausel WHERE Anweisung Zugabe erreicht werden. Wie in,

WHERE PVC.content = 'red' AND PVC.content = 'small' 
+0

Sie würden * denken * es wäre so einfach. Aber es ist nicht. Wie viele Reihen, genau, glaubst du, werden beide Bedingungen erfüllen? Wenn der Wert der "Bedingung" gleich "Rot" ist ... Wie groß ist die Wahrscheinlichkeit, dass derselbe Wert gleich "klein" ist? Ich gebe diesem eine ungefähr 0,00% Chance, eine Reihe zurückzugeben. – spencer7593

+0

Nun technisch beantwortet es die Frage, die schlecht formuliert war. Es scheint, dass das OP eigentlich OR wollte –