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

Mysql - abhängige Joins

Frage Entwicklung Datenbanken

Mitglied: pooleleven

pooleleven (Level 1) - Jetzt verbinden

13.10.2010 um 15:05 Uhr, 2435 Aufrufe, 5 Kommentare

Hallo Forum,

ich möchte folgende Aufgabe lösen:

Produkten werden Produkttexte (sprachabhängig) mitgegeben. Jetzt möchte ich aber die Produkt-Texte noch zusätzlich in Varianten einteilen.
Dabei gilt: Jedes Produkt (IMMER) in PRODUKTTAB hat einen DatenSatz in PRODUKTTEXTTAB mit variante_id=0. Jetzt kann es aber vorkommen, dass für manche Produkte in PRODUKTTAB neben dem Datensatz in PRODUKTTEXTTAB mit variante_id=0 auch noch ein Weiterer mit variante_id=2 vorhanden ist. Es stehen dann also 2 Datensätze (hinsichtlich Variante) in PRODUKTTEXTTAB pro Datensatz von PRODUKTTAB zur Verfügung. Wenn eine Variante größer 0 (z.B. 2) zur Verfügung steht, dann soll diese verwendet werden. ... ansonsten die Variante 0.

ich habe (als Beispiel) ein Produkt-Tabelle:

PRODUKTTAB mit den Spalten
id_produkt
hersteller_id

und dazu gibt es eine Produkt-Texte-Tabelle mit "Varianten":

PRODUKTTEXTTAB mit den Spalten
id_produkttext
produkt_id
sprach_id
variante_id
produkt_bezeichnung
produkt_beschreibung

OHNE VARIANTEN habe ich da ein einfaches Statement (sprach_id wird von aussen bestimmt)

Code:
select * PRODUKTTAB
left join PRODUKTTEXTTAB on PRODUKTTEXTTAB.produkt_id = PRODUKTTAB.id_produkt and PRODUKTTEXTTAB.sprach_id = $var_irgendeinesprach_id
group by PRODUKTTAB.produkt
... jetzt soll es aber mehrere Textvarianten geben. z.B. die Varianten 0 und 2. Wobei die Variante IMMER Texte enthält und die restlichen Varianten eventuell keine.

Code:
select * PRODUKTTAB
left join PRODUKTTEXTTAB on PRODUKTTEXTTAB.produkt_id = PRODUKTTAB.id_produkt and PRODUKTTEXTTAB.sprach_id = $var_irgendeinesprach_id and PRODUKTTEXTTAB.variante_id = $var_variante_id
group by PRODUKTTAB.produkt
Wie bekomme ich es hin, dass, wenn es z.B. für die Text-Variante 2 ($var_variante_id=2) keinen Eintrag gibt, das Statement auf den Eintrag mit der Variante 0 ($var_variante_id=0) zurückgreift?

Ich weiss, dass es mit CASE irgendwie geht ... aber ich habe keine ahnung, wie ich das mit JOIN "mischen"/verwenden kann.

Vielen Dank für einen Ansatz.
Mitglied: Netzfetzer
13.10.2010 um 16:13 Uhr
Hi,

verstehe ich das richtig?! Du willst aus PRODUKTTAB die id_produkt und aus der PRODUKTTEXTTAB den id_produkttext mit der höchsten variante_id...

select
PRODUKTTAB.id_produkt
max(PRODUKTTEXTTAB.variante_id)
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
group by PRODUKTTAB.id_produkt

Oder willst du die PRODUKTTEXTTAB.variante_id mit einem Parameterwert vorbelegen und diesen anzeigen -> bzw. wenn nicht vorhanden den nächst kleineren???

Gruß Netzfetzer
Bitte warten ..
Mitglied: pooleleven
13.10.2010 um 16:23 Uhr
Vielen Dank, erst mal:

wenn nicht vorhanden den nächst kleineren ... ist die richtige Vermutung. wenn es zum Produkt keinen text der variante 2 (oder nicht 0) gibt, dann soll der text der variante 0 genommen werden.

Leichte Verzweiflung ...
Bitte warten ..
Mitglied: Netzfetzer
13.10.2010 um 16:30 Uhr
select
PRODUKTTAB.id_produkt
max(PRODUKTTEXTTAB.variante_id)
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
where
PRODUKTTEXTTAB.variante_id <= $var_variante_id
group by PRODUKTTAB.id_produkt

Im Prinzip will ich mit dem Statement erreichen, dass SQL alle Varianten ausliest, die kleiner/gleich deiner Suchbedingung sind (zB variante = 2) und davon den maximalen Wert nimmt...

Also deine eingabe ist du willst die Variante 2:
- gibt es die Var. 0 und die Var.2 sollte das Statement 2 liefern, da dies der max-Wert ist
- gibt es nur die Var. 0 ist der max-Wert demenstprechend 0

Hilft dir das schon weiter?

Gruß Netzfetzer
Bitte warten ..
Mitglied: pooleleven
13.10.2010 um 16:43 Uhr
... oh da habe ich mich wohl unklar ausgedrückt, sorry.

Praktisches Bespiel:

Produkt:
Hagebuttentee mit der produkt_id=3

Produkttexte:
Variante0:
produkt_bezeichnung: hagebuttentee
produkt_beschreibung: hagebuttentee tut gut

Variante2:
produkt_bezeichnung: Tee von der Hagebutte
produkt_beschreibung: hagebuttentee schmeckt nicht gut

Produkt:
Schokolade mit der produkt_id=5

Produkttexte:
Variante0:
produkt_bezeichnung: Schokolade
produkt_beschreibung: Diese Schokolade ist die beste

Variante2:
--> hat dieses Produkt nicht

wenn ich dem statement mitgebe, dass es variante2 arbeiten soll (Auflistung der Produkte mit texten der Variante2), dann ermittelt es beim Hagebuttentee die Bezeichnung: Tee von der Hagebutte und bei der Schokolade, obwohl keine Variante2 vorhanden: Schokolade, also die Bezeichnung der Variante0 ... das wäre das Ziel.
Bitte warten ..
Mitglied: Netzfetzer
14.10.2010 um 11:08 Uhr
select
PRODUKTTAB.id_produkt,
max(PRODUKTTEXTTAB.variante_id),
PRODUKTTEXTTAB.bezeichnung
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
where
PRODUKTTEXTTAB.variante_id <= $var_variante_id and
PRODUKTTEXTTAB.bezeichnung is not null
group by PRODUKTTAB.id_produkt, PRODUKTTEXTTAB.bezeichnung

also als einschränkung die gesuchte variante <= deiner suchbedingung ist aber gleichzeitig auch die bezeichnung gefüllt ist...

Gruß Netzfetzer
Bitte warten ..
Ähnliche Inhalte
VB for Applications
gelöst Feld mit CSV-Daten aus MySQL-Datenbank einlesen (3)

Frage von Andreas.HH1 zum Thema VB for Applications ...

Datenbanken
gelöst MYSQL Abfrage Werte summieren (3)

Frage von Ghost108 zum Thema Datenbanken ...

Neue Wissensbeiträge
Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Peripheriegeräte

Was beachten bei der Wahl einer USV Anlage im Serverschrank

(6)

Tipp von zetboxit zum Thema Peripheriegeräte ...

Windows 10

Das Windows 10 Creators Update ist auf dem Weg

(6)

Anleitung von BassFishFox zum Thema Windows 10 ...

Administrator.de Feedback

Tipp: Ungelöste Fragen ohne Antwort in Tickeransicht farblich hinterlegen

Tipp von pattern zum Thema Administrator.de Feedback ...

Heiß diskutierte Inhalte
Windows Server
gelöst Update BackupExec 2015 auf 2016 führt zu SQL-Server Problem (16)

Frage von montylein1981 zum Thema Windows Server ...

Batch & Shell
gelöst Batch um Benutzer aus Sitzung abzumelden (15)

Frage von zeroblue2005 zum Thema Batch & Shell ...

Linux
gelöst Google Chrome startet nicht (12)

Frage von Thomas91 zum Thema Linux ...