MYSQL: Artikel mit Zubehör abfragen

querytail

Erfahrenes Mitglied
Hallo zusammen,

ich habe 3 Tabellen. In der ersten stehen Artikel, in der zweiten Zubehör und in der dritten die Zuordnung des Zubehörs zu den Artikeln.

1. Tab: arts
ID Nameusw.
1aSeife
1bShampoo
1cGel

2. Tab: zube
ID Nameusw.
2aQuirl
2bHalter
2cFüller

3. Tab: zube2arts
ID artsidzubeid
ax1a2a
ay1a2b
az1a2c
xx1b2a
xy1b2b
xz1c2a

Nun möchte ich eine Abfrage erstellen, die nur das Zubehör ausgibt, welches bei allen ausgewählten Artikeln zugeordnet ist.

Seife alleine müsste 2a, 2b und 2c ausgeben

Seife und Shampoo müsste 2a und 2b ausgeben

Seife, Shampoo und Gel müsste nur 2a ausgeben.

Danke und schönen Sonntag

querytail
 
Hallo, nein garnicht. Ich habe meinen Sonntag für den Chef geopfert und muss das noch hinbekommen. Ich bin da ******
 
Ungetestet:
SQL:
SELECT 
	z.id,
	z.name
FROM
	(
		SELECT DISTINCT id
		FROM arts
		WHERE id IN ('1a', '1b')
	) AS a
	LEFT JOIN zube2arts AS za
		ON a.id = za.artsid
	LEFT JOIN zube AS z
		ON z.id = za.zubeid
GROUP BY
	za.zubeid
HAVING 
	COUNT(DISTINCT za.artsid) = COUNT(DISTINCT a.id)

Nachtrag:
Bitte nicht dauernd sich selber antworten. Es gibt die Möglichkeit einen Beitrag zu bearbeiten.
 
Mache ich.

Aber danke für die Hammer-Lösung: Funktioniert einwandfrei. Ich muss noch in der Fa. testen, ob es mit allen Artikeln geht. Gebe in Kürze bescheid.

Dankeschön und gute Nacht !

So, ich habe das gerade ausprobiert und eines nicht bedacht: Die IDs der Artikel kommen nicht frei aus der Datenbank, sondern liegen als vorgegebene ID-Liste $artlist (implode / kommagetrennt) vor. Damit fällt also die Abfrage von arts weg.
 
Das innere Select brauchst du für die erwartete Anzahl. Das mit der List ist dank FIND_IN_SET( aber kein Problem

SQL:
SELECT 
    z.id,
    z.name
FROM
    (
        SELECT DISTINCT id
        FROM arts
        WHERE FIND_IN_SET(id, '1a,1b')
    ) AS a
    LEFT JOIN zube2arts AS za
        ON a.id = za.artsid
    LEFT JOIN zube AS z
        ON z.id = za.zubeid
GROUP BY
    za.zubeid
HAVING 
    COUNT(DISTINCT za.artsid) = COUNT(DISTINCT a.id)
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank. Das funktioniert auch. Habe eine letzte Frage:

Wie müsste die Abfrage aussehen, wenn die Tabelle arts nicht zur Verfügung steht und die Liste direkt in zube2arts abgerufen werden müsste?
 
Dann musst du die Anzahl IDS in PHP zäheln und ins SQL einfügen

SQL:
SELECT 
    za.zubeid,
FROM
	zube2arts AS za
WHERE
	FIND_IN_SET(za.artsid, '1a,1b')
GROUP BY
    za.zubeid
HAVING 
	-- Hier die Anzahl artsid angeben
    COUNT(DISTINCT za.artsid) = 2
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück