Werte abhängig von der Zuordnung

posting

Grünschnabel
Hallo, vielleicht kann mir hier jemand helfen.

Ich habe eine Shop-Aufgabe, in dem es um die Zuordnung von Gutscheinen geht. Der Kunde soll aber nicht einfach einen Gutschein zu einem Artikel zugeteilt bekommen, sondern sich diesen aus verschiedenen aussuchen können, die den Artikeln oder einer Kategorie, in der sich der Artikel befindet, zugeordnet sind.

Nun weiß ich schon, wie man die Artikel abruft, auch in Abhängigkeit der Kategorien. Wie aber bringt man die 6 Tabellen so zusammen, dass obige Anforderung funktioniert?

Die 6 relevanten Tabellen sehen wie folgt aus:

Artikel
os_arts
ID | Name | parent
--------------------
a1 | Demo1 |
a2 | Demo2 |
a3 | Demo3 |
a4 | Demo4 |
a5 | Demo5 |
a6 | Demo6 | a13
a7 | Demo7 | a13
a8 | Demo8 | a13

Kategorien
os_cat
ID | Name |
--------------------
c1 | Kat1
c2 | Kat2
c3 | Kat3
c4 | Kat4

Gutscheine
os_freevoucher
ID | obj |
--------------------
f1 | Free1
f2 | Free2
f3 | Free3
f4 | Free4
f5 | Free5
f6 | Free6

Zuordnung von Artikeln zu Kategorien
os_art2cat
ID | artid | catid|
--------------------
ac1 | a1 | c1
ac2 | a2 | c1
ac3 | a3 |c2
ac4 | a4 | c3
ac5 | a5 | c1
ac6 | a13 | c3


Zuordnung von Gutscheinen zu Artikeln
os_free2arts
ID | artid | voucherid|
--------------------
af1 | a1 | f1
af2 | a2 | f1
af3 | a3 | f2
af4 | a4 | f3
af5 | a5 | f1
af6 | a13 | f1

Zuordnung von Gutscheinen zu Kategorien
os_free2cats
ID | catid | voucherid|
--------------------
ac1 | c1 | f1
ac2 | c2 | f1
ac3 | c3 | f2
ac4 | c4 | f3
ac5 | c5 | f1



Danke in die Runde ******
 
Zuletzt bearbeitet:
Hallo im Forum!

Welches DBMS?
Ich habe deine Anforderung noch nicht verstanden. Was genau willst du haben?
Mach am besten gleich eine Tabelle als Beispiel was du als Lösung betrachtest. Dann versteht man's evtl. besser.
 
Hallo, die DB ist MySQL. Ich weiß, dass das direkt ne Hammer-Frage ist (zumindest für mich).

Es sollen, wenn der Kunde Artikel im Warenkorb hat, nur die Gutscheine auswählbar sein, die allen Artikeln zugewiesen sind.

Bsp: Der Artikel a1 | Demo1 ist über die Tabelle os_free2arts mit dem Gutschein f1 | Free1 verknüpft. Wenn jemand nur diesen Artikel im Warenkorb hat, soll f1 | Free1 als Auswahl stehen. Der Artikel a2 | Demo2 ist ebenfalls f1 | Free1 zugeordnet, d.h. bei Auswahl dieses Artikels bleibt f1 | Free1 als Auswahl bestehen.

Nimmt der Kunde Artikel a8 | Demo8 hinzu, wird kein Gutschein angezeigt. Nimmt der Kunde stattdessen a5 | Demo5 wird der Gutschein angezeigt, weil er über die Kategoriezuordnung os_free2cats ac5 | a5 | c1 zugewiesen ist.


Insgesamt muss also abgefragt werden, ob einem Artikel ein Gutschein direkt zugewiesen ist (os_free2arts) oder über die Kategorien (os_free2cats) in denen sich der Artikel befindet. Dann muss noch geprüft werden, ob ein Gutschein allen Artikeln im Warenkorb zugewiesen (Kategorie oder direkt) wurde. Ist dies der Fall, soll(en) der(die) Gutschein(e) ausgegeben werden.

Ich hoffe, das ist zu verstehen.

Danke vielmals !
 
1) Zusammenstellen aller Artikel-Gutscheinbeziehungen (die Kategorie also auf die Artikel runterbrechen)

2) Als Kriterium alle ausgewählten Artikel angeben

3) Das Resultat mit der Anzahl der der Artikel vergleichen um sicherzustellen dass alle Artikel denselben Gutschein haben

SQL:
SELECT
	v.id,
	v.obj	
FROM
	-- Die Gutscheine auf die Artikel herunterbrechen
	(
		-- Artikelgutscheine
		SELECT
			a.id AS artid,
			fa.voucherid	
		FROM
			os_arts			a,
			os_free2arts 	fa
		WHERE
			a.id = fa.artid
		-- Kategoriengutscheine
		UNION DISTINCT
		SELECT
			ac.artid,
			fc.voucherid
		FROM
			os_art2cat		ac,
			os_free2cats 	fc
		WHERE
			ac.catid = fc.catid
	) t,
	os_freevoucher v
WHERE
	t.voucherid = v.id 
	-- Hier die Auflistung aller Artikel
	AND artid IN ('a1', 'a2')
GROUP BY
	v.id,
	v.obj
HAVING
	-- Die Anzahl aller Artikel
	COUNT(*) = 2

Falls du mit Prepared-Statements arbeitest, könnte man den IN() auch durch ein FIND_IN_SET ersetzen
SQL:
	AND artid IN ('a1', 'a2')
-- ersetzen durch
	AND FIND_IN_SET(artid, 'a1,a2')
 
Zuletzt bearbeitet von einem Moderator:
Guten Abend,

es funktioniert hervorragend, aber ich muss doch noch einmal nachfragen, wie ich mit obigem Gutscheine anzeigen lassen, dessen Verknüpfung über einen Eltern-Artikel als Unterartikel (Child) erfolgt ist und der nicht selbst einer Kategorie bzw. einem Gutschein zugordnet ist.

Ich habe den Aufbau oben hinzugefügt. Artikel A13 hat 3 Kinder. A13 ist direkt dem Gutschein F1 und der Kategorie C3 zugeordnet und die dem Gutschein F2. Entsprechend müsste bei den 3 Kindern jeweils F1 und F2 ausgegeben werden.

Vielen Dank...
 

Neue Beiträge

Zurück