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, 2427 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

Webbrowser
gelöst Daten in entfernte Mysql DB schreiben (3)

Frage von nullacht15 zum Thema Webbrowser ...

Datenbanken
MySQL: Zwei Spalten in einer View zählen (11)

Frage von Memo66 zum Thema Datenbanken ...

Datenbanken
SQL Auswertung 2 Joins und SUM

Frage von c64b311ee9 zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...