[MySQL] Produkte abfragen | Produktfilter

ricounltd

Mitglied
Hallo,
ich weiss einfach nicht weiter wie ich dieses Problem lösen soll: Ich bin gerade dabei einen "Produktfilter" zu programmieren. Ich habe quasi einige Drop-Down Felder, mit denen der Benutzer die Filter setzen kann. Soweit funktioniert alles ganz gut, es gibt nur ein Problem mit der Ausgabe... wenn ich jetzt den ersten Filter setze, z.B. "Wohnraum" (Filter-ID: 1) mit dem Wert "Schlafzimmer" (Value-ID: 63) dann gibt mir der Filter, logischerweise alle Einrichtungsgegenstände für ein Schlafzimmer aus... bis hier hin funktioniert alles super... wenn ich jedoch einen weiteren Filter anwenden möchte, z.B. "Einrichtungsgegenstand" (Filter-ID: 4) mit dem Wert "Elektronik" (Value-ID: 12), dann gibt mir der Filter nicht das gewünschte Ergebnis aus, sondern addiert alle "elektronischen Geräte" zu meiner ersten Abfrage hinzu!
Also... Mein Filter in diesem Fall: "Alle elektronischen Geräte für ein Schlafzimmer" ...allerdings bekomme ich jetzt z.B. auch Küchengeräte und Spielekonsolen angezeigt, nur was will ich mit einem Mixer oder einem Pürierstab im Schlafzimmer :)
Ich hoffe ihr versteht was ich meine und könnt mir helfen?!

Hier nochmal ein Screen der SQL-Abfrage:
mysql.png

Das soll bedeuten, ich will nur die Produkt-ID's die auch wirklich mit meiner Abfrage übereinstimmen, in diesem wäre es z.B. nur die Produkt-ID 27, weil diese eben exakt auf meine Filter passt: "Schlafzimmer/Elektronisch" ;)

Ich bedanke mich schonmal im voraus für hilfreiche Unterstützung!

Mit besten Grüßen,
Rico
 
Mit deinem Screen kann ich nix anfangen.

Sind deine Filter alle auf dasselbe Feld? Wie sind die Tabellen aufgebaut?
Wie sieht dein bisheriges SQL aus?

Mach mir bitte ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
...mein SQL-Befehl lautet wie folgt:
HTML:
SELECT a.products_id, b.products_model
FROM products_characters a, products b
WHERE a.spec_status = '1'
AND b.products_status = '1'
AND a.spec_id IN(1,4)
AND a.spec_values_id IN(63,12)
AND a.products_id = b.products_id
ORDER BY a.products_id ASC

...und nochmal der Vollständigkeit halber, hier die Screens mit Erklärung:
mysql2.png

In der Abfrage habe ich aber auch Produkte, die jetzt nicht zum "Schlafzimmer" gehören (sind aber trotzdem elektronische Produkte)... auf Grund dessen, soll mir nur dieses Ergebnis angezeigt werden:
mysql3.png

....da es eben genau auf meine Filtereinstellungen zutrifft, weisst du was ich meine?!
Danke dir für deine Antwort!
 
Da musst du ein wenig anderst vorgehen.
Als erstes ermittelst du in PHP (oder mit was auch immer du programmierst) die Anzahl der Filter.
Dann setzt du jeden Filter mit OR an den nächsten Filter. Das ganze Gruppieren und zählen wieviele Einträge er findet. DIejenigen die genau gleich viele Einträge findet wie du Anzahl Filter hast, sind die gesuchten DInge.

SQL:
SELECT
	a.products_id
FROM
	products_characters a
WHERE
	(a.spec_id = 1 AND a.spec_values_id = 63)
	OR (a.spec_id = 4 AND a.spec_values_id = 12)
	-- Hier mit OR die weiteren Filter setzen..
GROUP BY
	a.products_id
HAVING
	-- Anzahl Filter hier einsetzen
	COUNT(*) = 2

Das ganze noch mit dem Produkt verküpfen und fertig
SQL:
SELECT
	prod.*
FROM
	products prod,
	(
		SELECT
			a.products_id
		FROM
			products_characters a
		WHERE
			(a.spec_id = 1 AND a.spec_values_id = 63)
			OR (a.spec_id = 4 AND a.spec_values_id = 12)
			-- Hier mit OR die weiteren Filter setzen..
		GROUP BY
			a.products_id
		HAVING
			-- Anzahl Filter hier einsetzen
			COUNT(*) = 2
	) sel
WHERE
	prod.products_id = sel.products_id
 
Zuletzt bearbeitet von einem Moderator:
Danke dir! Funktioniert soweit ganz gut... ich muss allerdings noch den "spec_status" abfragen, also nur Produkte die den Status = 1 haben. Muss ich das jetzt so schreiben:
HTML:
(a.spec_id = 1 AND a.spec_values_id = 63 AND a.spec_status = 1)
oder kommt das außerhalb der Klammer? Danke dir nochmal ;)
 
Du kannst ihn so in jeden Filter setzen oder AUsserhalb. geht beides
SQL:
SELECT
    a.products_id
FROM
    products_characters a
WHERE
    a.spec_status = 1
    AND (
        (a.spec_id = 1 AND a.spec_values_id = 63)
        OR (a.spec_id = 4 AND a.spec_values_id = 12)
        -- Hier mit OR die weiteren Filter setzen..
    )
GROUP BY
    a.products_id
HAVING
    -- Anzahl Filter hier einsetzen
    COUNT(*) = 2
 
Zuletzt bearbeitet von einem Moderator:
Zurück