2017-02-24 2 views
0

Diese meine Abfrage ist ohne Variante OptionenSELECT Produktvarianten SQL

SELECT p.*, pd.`name` AS `product_name` 
FROM `product` AS `p` 
LEFT JOIN `product_description` AS `pd` ON p.`id` = pd.`product_id` 
LEFT JOIN `product_to_variant` AS `pv` ON p.`id` = pv.`product_id` 
WHERE p.`status` = 0 
GROUP BY p.`id` 
ORDER BY p.`id` DESC; 

SQLFiddle: http://sqlfiddle.com/#!9/8955b/5

und die follwing Abfrage hat Optionen Variante, aber es funktioniert nicht

SELECT p.*, pd.`name` AS `product_name` 
FROM `product` AS `p` 
LEFT JOIN `product_description` AS `pd` ON p.`id` = pd.`product_id` 
LEFT JOIN `product_to_variant` AS `pv` ON p.`id` = pv.`product_id` 
WHERE p.`status` = 0 
    AND (pv.`feature_id` = 2 AND pv.`variant_id` = 6) 
    AND (pv.`feature_id` = 3 AND pv.`variant_id` = 11) 
GROUP BY p.`id` 
ORDER BY p.`id` DESC; 

und ich auch versuchen, abzufragen, aber es gibt keine Ausgabe

Haben Sie eine andere Idee, wie die Produkte zu erhalten: 14, 15 durch spezifische variant_id 6 und 11 http://prntscr.com/ect2oh

+0

Diese GROUP BYs sind ungültig. Wird bei neueren MySQL-Versionen einen Fehler auslösen (außer im Kompatibilitätsmodus). Die allgemeine GROUP BY-Regel lautet: Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte identifizieren oder das Argument einer Gruppe sein Funktion! – jarlh

Antwort

0

Hier ist eine Methode, was Sie tun möchten:

SELECT p.*, pd.name AS product_name 
FROM product p LEFT JOIN 
    product_description pd 
    ON p.id = pd.product_id JOIN 
    product_to_variant pv 
    ON p.id = pv.product_id 
WHERE p.status = 0 AND 
     ((pv.feature_id = 2 AND pv.variant_id = 6) OR 
     (pv.feature_id = 3 AND pv.variant_id = 11) 
    ) 
GROUP BY p.id 
HAVING COUNT(DISTINCT feature_id) = 2 
ORDER BY p.id DESC; 

Anmerkungen:

  • Keine Zeile kann Ihre ursprünglichen Bedingungen erfüllen. Weil eine Spalte nicht zwei Werte gleichzeitig haben kann. Daher die OR anstatt AND.
  • Die Klausel HAVING prüft, ob beide Werte übereinstimmen.
  • Es ist keine LEFT JOIN bis pv erforderlich, weil Sie Werte aus dieser Tabelle in der WHERE-Klausel überprüfen - es muss Übereinstimmungen geben.
  • Die LEFT JOIN bis pa ist wahrscheinlich auch unnötig.
  • Die Verwendung von Backticks überall macht die Abfrage schwieriger zu schreiben und zu lesen.
+0

Danke, aber es gibt ein Problem, wenn 2 Produkte die gleichen Funktionen hat –

+0

Eine andere Idee, das Produkt 14, 15 von variant_id 6 und 11 zu erhalten? http://prntscr.com/ect2oh –

+0

@ JohnAndrea. . . Wie ist das ein Problem? Weißt du, was 'COUNT (DISTINCT)' tut? –

0

Vielleicht so:

SELECT pv.* FROM `product_to_variant` AS `pv` 
WHERE (pv.`feature_id` = 2 AND pv.`variant_id` = 2) 
OR (pv.`feature_id` = 3 AND pv.`variant_id` = 11) 

Statt AND, die sagt, Sie müssen beide feature_id und variant_id in den Ergebnissen, verwenden OR, weil es beide dauert.

+0

ja, aber ich brauche "UND" –

+0

prntscr.com/ect2oh –