SQL ManytoMany Abfrage

Puenkchen

Cadet 3rd Year
Registriert
Aug. 2008
Beiträge
45
hallo
ich stehe vor einem kleinem problem und zwar geht es darum dass ich einen onlineshop selbst aufstelle.

die artikel habe/wollte ich in kategorien einteilen sprich ein produkt gehört zb. der kategorie computer hardware und mainboards an.
um zu wissen welche artikel im angebot stehen sollte man einfach eine kategorie "angebot" hinzufügen.

das ganze ist halt eine manytomany relation zwischen der tabelle tblArtikel und tblKategorie.
hier ein screenshot des mld:

avds8pf4.jpg


wenn man auf die seite index.php/page=computer geht sollten auf der 1. seite die angebote in der passenden kategorie angezeigt werden.
also müsste man eine sql anfrage stellen die einen artikel auf die 2 kategorien prüft(computer und angebot).

SELECT fiArtikel FROM tblArtikelKategorie WHERE fiKategorie = 4 and fiKategorie = 5 wäre ja sofort der erste gedanke jedoch wird dieses argument niemals true..

hoffe ihr versteht mein problem und könnt mir helfen

mfg puenkchen
 
Hi,

klassischer Fehler:
Man sagt Kategorie 1 und Kategorie 2, meint aber Kategorie 1 oder Kategorie 2 ;)

=> SELECT fiArtikel FROM tblArtikelKategorie WHERE fiKategorie = 4 OR fiKategorie = 5

Bye,

Tailtinn
 
aber dann erhalte ich ja alle artikel die in der kategorie computer sind ohne angebot
und alle angebote die nicht unbedingt zu computer angehören?
oder verstehe ich das jetzt falsch?^^
 
Ah, nein. Sorry, da hab ich Dich falsch verstanden bzw nicht richtig nachgedacht... :rolleyes:

Ich würde das über ein zusätzliches Feld (IstAngebot: bit/bool) lösen.
Entweder direkt am Artikel oder in der Kategorien-Zuordnung. Je nachdem, ob Produkte immer in allen Kategorien ein Angebot sind oder nur in ausgewählten.


Wenn Du "Angebote" als Kategorie beibehalten willst, musst Du das über einen Sub-Select lösen:

SELECT fiArtikel FROM tblArtikelKategorie WHERE fiKategorie = 4 AND fiArtikel IN (SELECT fiArtikel FROM tblArtikelKategorie WHERE fiKategorie = 5)


Alternativ über einen Join:

SELECT fiArtikel
FROM tblArtikelKategorie tProdukte
INNER JOIN tblArtikelKategorie tAngebote ON tProdukte.fiArtikel = tAngebote.fiArtikel
WHERE tProdukte.fiKategorie = 4 AND tAngebote.fiKategorie = 5
 
das klingt schon besser ;)

habe es jetzt am laufen mit IN, ist einfacher zu handhaben
das mit dem INNER JOIN ist mir noch ein wenig ein rätsel..

aber vielen dank.. =)
 
Noch 2 Alternativen.
Exists ist oft schneller (hängt natürlich immer vom DB-System und den Daten ab). Insbesondere kann das "In" langsam werden wenn die Menge der Daten im Subselect sehr groß wird (weiß nicht was du für Größenordnungen anstrebst).
Code:
SELECT fiArtikel FROM tblArtikelKategorie ka1
WHERE fiKategorie = 4
AND Exists (
    SELECT 1
    FROM tblArtikelKategorie ka2
    WHERE ka1.fiArtikel=ka2.fiArtikel
    AND fiKategorie = 5
)

Auch ne elegante Möglichkeit:
Code:
Select Min(fiArtikel) from(
    SELECT fiArtikel
    FROM tblArtikelKategorie
    WHERE fiKategorie = 4
    
    Union All

    SELECT fiArtikel
    FROM tblArtikelKategorie
    WHERE fiKategorie = 5
) GROUP BY fiArtikel
HAVING count(*) = 2
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben