Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung Datenbanken

SQL-Abfrage für Artikel mit mehrern Varianten

Mitglied: shaendle

shaendle (Level 1) - Jetzt verbinden

13.08.2008, aktualisiert 16.08.2008, 3980 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 ..
Ähnliche Inhalte
Datenbanken
SQL Abfrage aus mehreren Tabellen
gelöst Frage von el-torontoDatenbanken2 Kommentare

Hallo, auf dem Bild die vereinfachte Darstellung. Problematik: - Tabelle 1 enthält hunderte Kunden und wird mit Werten und ...

PHP
Abfrage SQL
gelöst Frage von dudeldoedelPHP3 Kommentare

Hallo zusammen, kann man das in einer SQL Abfrage erreichen ??? Feldwert lautet: {"565":{"textinput":{"comment":"1400"}}} als Ergebnis soll ausgelesen werden ...

Blogs
Produkt Amazon Artikel - per API abfragen Partnerprogramm
Frage von vServerBlogs4 Kommentare

Hallo, wie ist es möglich sobald ich den Link (Partnerprogramm) hier im Produkt von einem Amazon Produkt angebe, das ...

Datenbanken
SQL - Abfragen - Mehrere Tabellen - Problem WHERE-Filter
gelöst Frage von Andy1987Datenbanken12 Kommentare

Guten Morgen, ich muss mich derzeit mit SQL-Abfragen rumschlagen, um unsere Inventarisierung etwas Übersichtlicher zu gestallten. Mein Problem ist ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 2 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 3 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 3 TagenSicherheit11 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Entwicklung
VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen
gelöst Frage von JuweeeEntwicklung9 Kommentare

Hallo, ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle ...

Firewall
Penetrationstester-Labor - Firewalls
Frage von Oli-nuxFirewall9 Kommentare

Mich würde interessieren warum man beim Einrichten eines Penetrationstester-Labor (VMs) die Firewall der Systeme deaktivieren soll? Hat das nur ...

Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen9 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...