Hilfe bei Query: 2 Tabellen über JOIN verbinden und NULL-Werte anzeigen bei fehlenden 2.Key

fmkw1

Benutzer
Beiträge
5
Hier mal mein DB-Schema
http://sqlfiddle.com/#!2/68c973/4

Also ich habe eine Tabelle mit depots und eine Tabelle mit Lagerdaten.

Ich möchte für jedes Depot, und für jeden Artikel den Meldebestand haben.
Ist ein Artikel in einem Depot nicht vorhanden soll NULL angezeigt werden.

Wenn ich in der ON-Klausel beim JOIN eine WHERE Bedingung einfüge funktioniert es weil der JOIN keine Partner findet und dann NULL ausgibt.

WEnn ich das aber über alle Daten laufen lasse, findet der JOIN genügend Partner, leider nicht gruppiert nach Artikelnummer und gibt keine NULL-WErte zurück.

Bin für jede Hilfestellung dankbar.

Ich habe auch schon eine Funktion in Betracht gezogen.
 
Werbung:
Bin für jede Hilfestellung dankbar.

Da ist einiges falsch:

  • Datentypen, INT ist nicht für Timestamps gedacht, da gibt es korrekte Datentypen
  • du verwendest referentielle Beziehungen zwischen den Tabellen, aber eine Engine, die das nicht unterstützt
  • du verwendest GROUP BY ohne aber alle Spalten des Resultates entweder zu aggregieren oder zu gruppieren. Jede DB dieser Welt wird das als Fehler erkennen und MySQL in der Zukunft auch. Bis dahin liefert es ein weitestgehend zufälliges Ergebniss.
  • du vermischt die JOIN-Condition mit der Where-Condition

Ich hab jetzt nicht die Zeit, die Daten zu übernehmen (PostgreSQL kommt mit dieser vergurkten MySQL-Syntax nicht immer gleich klar), vielleicht heute Abend mehr.
 
  • Datentypen, INT ist nicht für Timestamps gedacht, da gibt es korrekte Datentypen
Ich arbeite da mit einem Contao CMS und generie Datenbank-Schemas über das CMS. Dieses legt mir immer entweder int(10) oder varchar(255) an. Die Spalte kann man aber vernachlässigen, da sie nicht verwendet wird. Lediglich das CMS greift darauf zu und wandelt es mittels PHP-Funktion in ein Datum um, der Funktion muss ein Integer-Wert übergeben werden, deswegen ist es eigentlich richtig.

  • du verwendest referentielle Beziehungen zwischen den Tabellen, aber eine Engine, die das nicht unterstützt
Da weiß ich leider nicht ganz was gemeint ist.


  • du verwendest GROUP BY ohne aber alle Spalten des Resultates entweder zu aggregieren oder zu gruppieren. Jede DB dieser Welt wird das als Fehler erkennen und MySQL in der Zukunft auch. Bis dahin liefert es ein weitestgehend zufälliges Ergebnis.

Habe ich angepasst. Ergebnis ist leider das selbe. Bzw wenn ich die Abfrage so ändere dass ich nur namen oder id bekomme und nach der gruppiere.
  • du vermischt die JOIN-Condition mit der Where-Condition

Das habe ich nur mal rein gemacht um zu testen, ob es mit nem Join funktioniert wenn ich nur einen Artikel in der Abfrage habe. Habe ich geändert!


Danke für deine Tipps und sorry für meine späte Antwort.
 
Ok :eek::(:confused:

Naja ich denke, dass ich da einen Denkfehler habe, weil das Datenbank-Schema und alle meine anderen Queries funktionieren einwandfrei.

Das Problem ist dass ich halt für jeden Eintrag in der Depot-Tabelle und für jede Artikelnummer einen Partner finden oder NULL anzeigen will, aber dadurch, dass ich die Depotnr in der 2.Tabelle habe halt immer ein Join-Partner gefunden wird. Ich weiß nicht wie ich das zusätzlich nach Artikelnummer noch aufschlüsseln kann, dass er mir das ganze für jede Artikelnummer anzeigt. :(
 
Hier mal mein DB-Schema
http://sqlfiddle.com/#!2/68c973/4

Also ich habe eine Tabelle mit depots und eine Tabelle mit Lagerdaten.

Ich möchte für jedes Depot, und für jeden Artikel den Meldebestand haben.
Ist ein Artikel in einem Depot nicht vorhanden soll NULL angezeigt werden.

Das das sqlfiddle nix liefert muß ich die Tabellen erraten.

Code:
test=# create table depots (id int primary key, name text);
CREATE TABLE
test=*# create table artikel (id int primary key, name text);
CREATE TABLE
test=*# create table lagerdaten(depot int references depots, artikel int references artikel, menge int);
CREATE TABLE
test=*# insert into depots values (1, 'depot1');
INSERT 0 1
test=*# insert into depots values (2, 'depot2');
INSERT 0 1
test=*# insert into artikel values (1, 'artikel 1');
INSERT 0 1
test=*# insert into artikel values (2, 'artikel 2');
INSERT 0 1
test=*# insert into lagerdaten values (1, 1, 10);
INSERT 0 1
test=*# insert into lagerdaten values (2, 2, 20);
INSERT 0 1
test=*# select d.name, a.name, l.menge from depots d cross join artikel a left join lagerdaten l on ((d.id,a.id)=(l.depot,l.artikel));
  name  |  name  | menge
--------+-----------+-------
 depot1 | artikel 1 |  10
 depot1 | artikel 2 |
 depot2 | artikel 1 |
 depot2 | artikel 2 |  20
(4 rows)

Entspricht das in etwa dem, was Du hast und was Du suchst?
 
Vielen Dank für deinen Support.

Mein Datenbank-Schema sieht etwas anders aus. sqlfiddle ist anscheinend abgelaufen. Hier nochmal: http://pastebin.com/rNiRbLFf

Der Unterschied zu deinem Query ist, dass bei mir zwar eine Artikel-Tabelle existiert, aber hier nicht verknüpft wird, weil ich diese nicht benötige.

Weil ich quasi nur die 5 Depots habe und dazu für jeden Artikel anzeigen will ob ein stand vorhanden ist. Wenn in der lagerstand tabelle der artikel nicht vorhanden ist, soll gleich NULL ausgegeben werden.
 
Werbung:
Ah ich habe es denke ich.

Ich check jetzt, warum die Artikeltabelle auch benötigt wird, weil es einfach nicht funktioniert, Meldestände und die Artikelnummer aus der gleichen Tabelle zu ziehen.

Habe meine Artikel-Tabelle auch geknüpft und es scheint zu funktionieren

Code:
select
    d.name,
    d.depotnr,
    l.meldebestand,
    l.artikelnummer
from
    mm_pim_depots d
cross join
    mm_pim_bugmal b
left join
    mm_pim_lagerdaten l
on
    ((d.depotnr, b.artikelnummer)=(l.depot,l.artikelnummer))

Vielen Dank mal ;):)

PS: mm_pim_bugmal sind ist meine Artikel-Tabelle
 
Zurück
Oben