Mysql-Abfrage mit Null-Werten

Spechter

Mitglied
Hallo,
ich habe ein Problem mit einer verschachtelten Mysql-Abfrage.
Und zwar habe ich 2 Tabellen, Firma und Kontakt.
In Kontakt ist ein Feld names FirmaID, welches auf die Tabelle Firma referenziert. Jetzt will ich gerade eine View erstellen die alle Felder der beiden Tabellen beinhaltet. Jedoch kann es auch sein dass das Feld FirmaID in Kontakte auf NULL steht, und da besteht egtl mein großes Problem. Wie mache ich das er die Werte mit NULL übernimmt?
Das ist mein Versuch welcher nicht geht, da er viel zu viel Werte ausspuckt..
PHP:
CREATE VIEW 
kontakte 
AS 
SELECT distinct
count(*)
FROM 
firma f, kontakt k
WHERE 
(k.firmaid = f.idfirma OR k.firmaid IS NULL);
 
Hi,

dann müsstest Du einen LEFT JOIN machen:

Code:
SELECT <felder> FROM firma f
   LEFT JOIN kontakt k
   ON (k.firmaid = f.idfirma);

Dein Versuch sollte allerdings nicht zu viele Werte ausgeben, sondern zu wenige.
Und was soll das "DISTINCT COUNT(*)"? Du willst doch die Felder.

LG
 
Danke für den Tipp, werde ich morgen testen.
Das count(*) hab ich nur benützt um zu testen wieviele Treffer ich habe. Wie ich die einzelnen Felder auswähle weiß ich, das ist kein Problem.
In Kontakte stehen ca 600 Einträge und wenn ich meine Version teste bin ich bei ca 1000-2000 Einträge.

Morgen sage ich dann ob es geklappt hat :)
 
Ich bekomme immer noch zu wenig Ergebnisse. Ich glaube das Problem ist einfach dass es teilweise keine passenden Einträge von kontakt in firma und diese einfach weggelassen werden (also die null-werte in kontakt).
Macht ja auch Sinn, nur brauch ich möglichst alle Einträge und bei denen wo firma null ist soll halt auch der rest null sein.
Wahrscheinlich mach ichs jetzt mit 2 Select Statements...
 
Hi,

Ich glaube das Problem ist einfach dass es teilweise keine passenden Einträge von kontakt in firma und diese einfach weggelassen werden (also die null-werte in kontakt).

Nein, bei einem LEFT JOIN werden auch Datensätze ausgewählt, die keine Entsprechung in der gejointen Tabelle haben. Irgendwas machst Du falsch. Du kannst ja mal ein paar Testdaten zusammenstellen und einen Dump zur Verfügung stellen.

LG
 
Ok ich hab mal ein Dump erstellt. Habe es als Anhang beigefügt. Die Daten hab ich angepasst ist aber dasselbe Problem :)
Hier mein Select-Statement mit dem ich teste
PHP:
SELECT * FROM abteilung a
   LEFT JOIN kontakt k
   ON (k.abteilungid = a.idabteilung);

Grüße Stefan
 

Anhänge

  • database.txt
    3,5 KB · Aufrufe: 28
Hi,

hmm, also ehrlich gesagt, nenne ich das kaputte Daten. Ein Fremdschlüssel sollte nicht leer sein.
Ein LEFT JOIN funktioniert so, dass auch Abteilung 5 (wenn es die gäbe) ausgewählt würde, auch wenn in Tabelle 2 kein Datensatz mit dem Fremdschlüssel 5 existiert. Die Felder von Tabelle 2 wären in dem Fall im Ergebnis halt NULL.
Bei Dir ist es jetzt aber so, dass es Datensätze gibt, die als Fremdschlüssel NULL haben. Welcher Abteilung sollen die zugeordnet werden? Das ergibt keinen Sinn.
Wenn Du jetzt die JOIN-Bedingung auf "OR k.abteilungid IS NULL" erweiterst, wird natürlich jeder "NULL-Datensatz" aus kontakt jeder Abteilung zugeordnet. Also hast Du wieder zu viele Datensätze.

Du könntest jetzt den Join umdrehen (kontakt LEFT JOIN abteilung), aber dann würde besagte Abteilung 5 rausfallen.

Was ist denn überhaupt das Ziel? Wie soll das Ergebnis genau aussehen?

LG
 
Ah das ist interessant zu wissen.
Ich habe die Felder auf NULL gesetzt, weil ich für diese keinen passenden Eintrag habe. Ich habe die Daten exportiert aus einer anderen Datenbank und wie man sieht ist sie Lückenhaft.
Mein Ziel ist es, eine Auswahl zu erstellen wo ich alle Kontaktdaten habe (Später alle Personendaten). Jedoch sollen da auch, wenn vorhanden, die Abteilung und die Firma angezeigt werden.
Ich würde ja die Abteilung zb auf 0 setzen (den Wert gibt es nie), jedoch geht das nicht da ich eine Fremdschlüsselbeziehung eingebaut hab.
Denkst du es ist sinnvoll einfach einen Datensatz in Abteilung einzufügen der praktisch leer ist und darauf dann die Kontakte mit NULL zu referenzieren?
 
Hey danke, das ist die Lösung :)
Der andere Fall ist für mich sowieso uninteressant, wenn es also eine Abteilung gibt und diese nicht benützt wird (was sowieso nicht der Fall ist).

Grüße Stefan
 
Zurück