Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

SQL-Abfrage für Artikel mit mehrern Varianten

Frage Entwicklung Datenbanken

Mitglied: shaendle

shaendle (Level 1) - Jetzt verbinden

13.08.2008, aktualisiert 16.08.2008, 3860 Aufrufe, 7 Kommentare

Hallo,

ich stehe vor dem Problem, eine Abfrage über eine Aritkeldatenbank zu machen, welche Artikel herausfiltert, die mehrere Varianten haben. Also z.B. Hose mit Farbe blau und Größe 58.

Artikel ist eine Tabelle und die verwendeten Varianten sind in einer extra Tabelle gespeichert.

Beispiel

tabelle_artikel
tabelle_artikel_varianten
tabelle_varianten_values

Mit einem INNER JOIN und einer UNION-Abfrage bekomme ich das nicht geregelt, da ich im Prinzip zwei Bedingungen habe. Zum einen muss die ID der Variante übereinstimmen und zum anderen die ID des Values (zb. blau oder 58). Für den Artikel stehen aber in der Tabelle tabelle_artikel_varianten zwei Einträge drin. Für jede Variante einen Zeile mit der ID der Variante und der ID des Values

Ich hoffe ich habe mich einigermaßen klar ausgedrückt.

Hat jemand einen Tipp wie ich sowas ohne mehrere Abfragen geregelt bekomme?

Viele Grüße
Sascha
Mitglied: AndreasHoster
13.08.2008 um 16:09 Uhr
Na ja, ganz ohne Unterabfrage geht sowas nicht.
Aber im Prinzip:
select .... (Deine Select Abfrage samt Inner Join etc.)
WHERE (((tabelle_artikel.ID) In (SELECT ID FROM tabelle_artikel_varianten GROUP BY ID HAVING Count(*)>1 )))

Die SELECT ID FROM tabelle_artikel_varianten GROUP BY ID HAVING Count(*)>1 filtert alle IDs aus den Varianten raus, die mehr als einmal vorkommen und mit < where ID in (Select ... > nehmen wir dann nur die IDs, die in der Unterabfrage auch rausgesucht wurden. Das müsste ja das sein, was Du willst.

Ansonsten wäre noch interessant welches DBMS, weil verschiedene DBMS nicht immer alle SQL Möglichkeiten unterstützen und manchmal andere Syntax haben können.
Bitte warten ..
Mitglied: Biber
13.08.2008 um 18:33 Uhr
Moin shaendle,

willkommen im Forum.
</OT>
Im Bereich "Datenbanken" findest Du folgenden Hinweis:
Bitte bei Fragen im Bereich Datenbanken auch immer das verwendete Datenbanksystem angeben!

Beispiele: mySQL 4.0 oder Oracle 9i oder Microsoft SQLServer Express etc.
Insbesondere SQL-bezogene Fragen können ohne diese Informationen nicht sinnvoll beantwortet werden.


Ich weiss, es ist so langweilig und hölzern formuliert, dass es kein normaler Mensch zu Ende liest. Ich suche auch immer noch eine schöne peppige, verständliche Formulierung, die nicht oberlehrerhaft klingt.
Bitte: Tipps dazu Tag und Nacht gern an mich per PN.
</OT>

Die Struktur ist mir in höchstem Grade unklar.
Poste doch bitte mal eine Skizze davon (also relevante Attribute je Tabelle).
Was ist denn mit Artikeln ohne Varianten? Fallen die untern Tisch?
Oder meinst Du eigentlich mit der heutigen Artikel-Tabelle "Artikelgruppen" oder Kategorien wie Hemden, Blusen, Hosen oder Krawatten, die dann jeweils spezifische Attribute haben?

"DB"-System ist vermutlich M$-Access, alle anderen Tools hätten sich vermutlich automatisch beendet...

Grüße
Biber
Bitte warten ..
Mitglied: shaendle
13.08.2008 um 20:49 Uhr
Danke für die schnelle Antwort. Okay, da hab ich wohl ein paar Infos vergessen.

Das Ganze läuft auf MySQL 5.x

Hier nochmal der Versuch die Struktur zu erläutern. Im Wesentlichen soll der Kunde in einem Onlineshop einen Filter auf Artikelvarianten setzen können. Wenn jemand nach blauen Klamotten in Größe 58 sucht, sollen ihm diesen angezeigt werden. Egal ob Hose, Rock, T-Shirt. Hauptsache blau und Größe 58.

Um das Ganze zu verkomplizieren kann aber auch noch Hersteller und Artikelgruppe gewählt werden. Dann also alle blauen Jeanshosen von Levis in Größe 48.

Die Tabellen:

Artikel:

Artikel_ID
Artikel_HERSTELLER (nur eine ID)
Artikel_GROUP (nur eine ID)


Artikelvarianten:

Varianten_ID
Artikel_ID
Variante_PREIS


Variantenarten_der_Artikelvariante:

Varianten_ID
Variantenart_ID
Variantenartvalue_ID


Variantenart (Farbe, Größe):

Variantenart_ID
Variantenart_NAME (z.B. Farbe)


Variantenartvalue (Blau, Rot, 58, 45):

Variantenartvalue_ID
Variantenartvalue_NAME (z.B. Blau)


Das Problem ist nun, dass in der Tabelle Variantenarten_der_Artikelvariante mehrere Datensätze pro Artikelvariante stehen. Die Hose ist ja blau und soll die Größe 58 haben. Der Verweis auf den Hersteller und die Aritkelgruppe steht in der Tabelle Artikel. Hersteller und Aritkelgruppe ist ebenfalls eine extra Tabelle.

So, ich hoffe jetzt ist die Problemstellung etwas klarer geworden.

Wäre super wenn ich einen Denkanstoß bekäme. Bin mittlerweile "betriebsblind"...

Viele Grüße
Sascha
Bitte warten ..
Mitglied: shaendle
13.08.2008 um 20:50 Uhr
Hallo Andreas,

Danke für die schnelle Antwort. Okay, da hab ich wohl ein paar Infos vergessen.

Das Ganze läuft auf MySQL 5.x

Hier nochmal der Versuch die Struktur zu erläutern. Im Wesentlichen soll der Kunde in einem Onlineshop einen Filter auf Artikelvarianten setzen können. Wenn jemand nach blauen Klamotten in Größe 58 sucht, sollen ihm diesen angezeigt werden. Egal ob Hose, Rock, T-Shirt. Hauptsache blau und Größe 58.

Um das Ganze zu verkomplizieren kann aber auch noch Hersteller und Artikelgruppe gewählt werden. Dann also alle blauen Jeanshosen von Levis in Größe 48.

Die Tabellen:

Artikel:

Artikel_ID
Artikel_HERSTELLER (nur eine ID)
Artikel_GROUP (nur eine ID)


Artikelvarianten:

Varianten_ID
Artikel_ID
Variante_PREIS


Variantenarten_der_Artikelvariante:

Varianten_ID
Variantenart_ID
Variantenartvalue_ID


Variantenart (Farbe, Größe):

Variantenart_ID
Variantenart_NAME (z.B. Farbe)


Variantenartvalue (Blau, Rot, 58, 45):

Variantenartvalue_ID
Variantenartvalue_NAME (z.B. Blau)


Das Problem ist nun, dass in der Tabelle Variantenarten_der_Artikelvariante mehrere Datensätze pro Artikelvariante stehen. Die Hose ist ja blau und soll die Größe 58 haben. Der Verweis auf den Hersteller und die Aritkelgruppe steht in der Tabelle Artikel. Hersteller und Aritkelgruppe ist ebenfalls eine extra Tabelle.

So, ich hoffe jetzt ist die Problemstellung etwas klarer geworden.

Wäre super wenn ich einen Denkanstoß bekäme. Bin mittlerweile "betriebsblind"...

Viele Grüße
Sascha
Bitte warten ..
Mitglied: AndreasHoster
15.08.2008 um 16:31 Uhr
Ich glaube, ich sehe jetzt das Problem.

Du willst nach Farbe und Größe filtern können, aber die stehen nicht in verschiedenen Feldern der Tabellen, sondern sowohl Größe als auch Farbe stehen in Variantenarten_der_Artikelvariante.Variantenartvalue_ID und der Feldinhalt von Variantenarten_der_Artikelvariante.Variantenart_ID legt fest ob es Farbe, Größe oder sonstwas ist.
D.h. ich habe nicht einen Datensatz in dem Größe und Farbe steht, sondern 2 Datensätze und in einem steht die Größe und in einem anderen die Farbe.
Richtig?

Da müsste man dann mit 2 Unterabfragen arbeiten und dann die Ergebnisse nehmen, die in beiden drin sind.
Die gesamten Joins sind mir jetzt zu aufwendig. Gehen wir davon aus, daß Du es so gejoint hast, daß das Ergebnis so aussieht (im folgenden JOIN genannt):
Artikel_ID, Variantenart_Name, Variantenartvalue_Name (die Felder brauchen wir auf alle Fälle)
Select * from JOIN where Artikel_ID in (Select Artikel_ID from JOIN where Variantenart_Name='Farbe' and Variantenartvalue_Name='Blau') and Artikel_ID in (Select Artikel_ID from JOIN where Variantenart_Name='Größe' and Variantenartvalue_Name='58')

Ich hoffe, das reicht als Anstoß, es syntaktisch korrekt zu machen ist mir gerade zu aufwendig.
Bitte warten ..
Mitglied: Biber
15.08.2008 um 19:50 Uhr
Na ja,
so richtig die sprechenden Infos bekommen wir ja ohnehin nicht raus.
Die einzigen "lesbaren" Werte, nämlich
Variantenart.Variantenart_NAME ("FARBE") und
Variantenart_Value.VariantenartValue_NAME ("blau")
..stehen ja in der der WHERE-Klausel.
Und die Informationen über Artikel_HERSTELLER und Artikel_GROUP hängen noch in der Luft (da kennen wir die Refernenztabellen nicht.

Also bekommen wir eigentlich nur zwei interessante Infos zurück
- kein Satz gefunden, falls kein Satz gefunden wird oder
- den ArtikelPreis und die Artikel_ID

01.
SELECT Art.ARTIKEL_ID AV.Variante_preis From  
02.
Variantenart VA, 
03.
Variantenarten_der_Artikelvariante AVA, 
04.
Variantenartvalue VAV, 
05.
Artikel Art 
06.
Where  
07.
VA.Variantenart_ID = AVA.Variantenart_ID and 
08.
VAV.Variantenartvalue_Id = AVA.Variantenartvalue_ID and 
09.
VA.Varianten_ID =  AV.Varianten_ID AND 
10.
Art.ARTIKEL_ID = AV.ARTIKEL_ID AND 
11.
VAV.Variantenart_NAME = 'FARBE' AND 
12.
VAV.Variantenartvalue_Name = 'Blau' 
Aber so kann man/frau keine Abfragen formulieren bzw wartbar gestalten.

@shaendle
Brich die Versuche hier ab.
Es ist vollkommen in Ordnung, wenn irgendein Theoretiker/Fanatiker die Datenbank-Persistierung bis zur 12ten Normalform getrieben hat. Jedenfalls wenn ihr 800 TeraByte an Daten verwalten wollt.

Aber der Zugriff speziell für Abfragen muss nicht über 1:1-Zugriffe auf die physische Struktur erfolgen.
Sondern darf auf eine logische Struktur erfolgen. Dafür sind Datenbanken da.
Bau Dir da ein, zwei Views drüber,
die den Artikel (Id, Bezeichnung, HerstellerNAME, GruppenNAME) und die Varianten-Seite (Artikel,
VariantenName, VariantenPreis, VariantenValueNameA ... VariantenvalueNameX) als 2 Tabellen anzeigen.
In views brauchst Du dann auch keinen Unfug mehr wie "Variantenartvalue_Name" als Feldnamen.
Und feuer dann die Ad-hoc-Queries auf Views ab.

Grüße
Biber
Bitte warten ..
Mitglied: shaendle
16.08.2008 um 23:56 Uhr
Also ich hab jetzt Deinen Ansatz mal versucht. Die einzige Abfrage die zunächst keinen MySQL-Fehler ergibt ist folgende:

01.
SELECT a.*, ah.*, sg.group_parent, sg.group_code, av.* FROM shop_article a INNER JOIN shop_article_html ah ON a.article_id = ah.article_id INNER JOIN shop_article_group sg ON a.article_group = sg.group_id INNER JOIN shop_article_var av ON a.article_id = av.article_id INNER JOIN shop_article_var_value avv ON av.variante_id = avv.variante_id WHERE ah.article_lang = 'ger' AND av.article_language = 'ger' AND a.article_active = '1' AND a.article_code <> '' AND av.article_price > '0' IN (SELECT a.article_id FROM shop_article a INNER JOIN shop_article_html ah ON a.article_id = ah.article_id INNER JOIN shop_article_group sg ON a.article_group = sg.group_id INNER JOIN shop_article_var av ON a.article_id = av.article_id INNER JOIN shop_article_var_value avv ON av.variante_id = avv.variante_id WHERE ah.article_lang = 'ger' AND av.article_language = 'ger' AND a.article_active = '1' AND a.article_code <> '' AND av.article_price > '0' AND avv.variante_var = '1' AND avv.variante_var_value='108') GROUP BY av.article_id ORDER BY av.article_special_price ASC, av.article_price ASC LIMIT 0,9
ok. Es sind halt noch ein paar WHERE-Klauseln versteckt und es werden ein paar Tabellen mehr gejoint. Allerdings bekomme ich so alle Einträge angzeigt.

Das mit den Subselects hab ich mir auch schon halb gedacht. Aber es will einfach nicht klappen

Vielleicht hast Du ja noch eine Idee??...
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Datenbanken
SUM oder AVG in SQL Abfrage dauert viel zu lange warum? (5)

Frage von samet22 zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage mit MAX() (9)

Frage von FrAmEr zum Thema Datenbanken ...

Datenbanken
gelöst Schleifen in SQL-Abfrage bei 2 Tabellen (2)

Frage von Aximand zum Thema Datenbanken ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (19)

Frage von patz223 zum Thema Windows Userverwaltung ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (15)

Link von Penny.Cilin zum Thema Viren und Trojaner ...