Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von fmkw1, 2 März 2015.

  1. fmkw1

    fmkw1 Benutzer

    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.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. fmkw1

    fmkw1 Benutzer

    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.

    Da weiß ich leider nicht ganz was gemeint ist.


    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.
    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.
     
  4. Distrilec

    Distrilec Datenbank-Guru

    Grundsätzlich kann man sagen:
    Ich benutze MySQL und etwas funktioniert nicht? MySQL ist schuld...
    Darauf wollte @akretschmer wahrscheinlich auch hinaus:)
     
    akretschmer gefällt das.
  5. fmkw1

    fmkw1 Benutzer

    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. :(
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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?
     
    fmkw1 gefällt das.
  7. fmkw1

    fmkw1 Benutzer

    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.
     
  8. fmkw1

    fmkw1 Benutzer

    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
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden