php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Datenbank Struktur, Gruppen, Auswerten


 
doerfnix
22-11-2011, 15:34 
 
Hallo,

Ich zerbreche mir im Moment den Kopf über ein kleines Problem und finde keine zufrieden stellende Lösung :

Ich habe ein Datenbank mit Name :
id Vorname Nachname Land
1 Karl Muster D
2 Jens Schmidt NL
3 Tanja Schmidt NL
4 Gustav Schmidt NL
....

Nun möchte ich einzelne Einträge als Gruppe markieren ( z.B. eine Familie )
-> Jens und Tanja Schmidt sind eine Familie, Gustav gehört nicht dazu.
id Vorname Nachname Gruppe Land
1 Karl Muster NULL D
2 Jens Schmidt 1 NL
3 Tanja Schmidt 1 NL
4 Gustav Schmidt NULL NL
....

Soweit so gut.
Nun möchte ich herausfinden wie viele Familien in welchen Land Wohnen
-> SELECT COUNT(id) FROM fam GROUP BY land

Wie bekomme ich es hin das doppelte Einträge in Gruppe nur einmal gezählt werden ??
Ich habe da irgendwie tomaten auf den Augen im mom. Oder hat jemand vieleicht eine bessere Idee wie ich in dem Fall die Tabelle aufbauen sollte ?

doerfnix

 
h3ll
22-11-2011, 15:36 
 
SELECT Land, COUNT(DISTINCT Gruppe) FROM fam GROUP BY Land

 
doerfnix
22-11-2011, 15:39 
 
Das Funktioniert nicht , beim oben genannten Beispiel würde

D 0 NL 1



herauskommen. Das habe ich auch schon probiert

 
h3ll
22-11-2011, 15:52 
 
Also für mich sieht das Ergebnis korrekt aus.

 
doerfnix
22-11-2011, 15:54 
 
Das korrekte Ergebnis müßte lauten : D 1 NL 2

 
h3ll
22-11-2011, 15:54 
 
Warum?

 
doerfnix
22-11-2011, 16:03 
 
1 Karl Muster NULL D -> 1 * D
2 Jens Schmidt 1 NL -> 1 * NL
3 Tanja Schmidt 1 NL -> doppelt, gehört zu id 2
4 Gustav Schmidt NULL NL -> 2 * NL

1 * D, 2 NL

In wirklichkeit steckt hier eine Kunden Datenbank dahinter, es gibt vereinzelt Kunden wo wir Kontakt zu einzelnen Abteilungen haben und diese Einzeln gelistet werden sollen, aber in der Statistik als 1 Kunde gezählt werden sollen.

Ich habe mir das so gedacht : Kunden-Tabelle mit allen Kunden ( z.B. MusterFirma, Müller Firma Abt. Holz, Müller Firma Abt. Stahl ... ) und eine Tabelle in der Gruppe-Namen gelistet sind ( z.B. Müller Firma) .
In der Auflistung werden diese dann als eine Firma mit Unterpunkten angezeigt:


Muster Firma
Firma Müller :



Abt. Holz
Abt. Stahl



Firma xyz

Vileicht gibt es ja auch eine bessere Lösung. In der Gruppentabelle nochmal alle Firmen aufzulisten, auch wenn es nur eine Abt. gibt, finde ich nicht so prikelnd.

doerfnix

 
h3ll
22-11-2011, 16:16 
 
firma:
id, firmenname

abteilung:
id, firma_id, abteilungsname

kunde:
id, abteilung_id, vorname, nachname


Aber wo hängt jetzt das Land? Beim Kunden oder bei der Abteilung?

 
doerfnix
22-11-2011, 21:53 
 
Die Firma ist unser Kunde, also kann hier eine Tabelle wegfallen.

firma:
id, firmenname

abteilung:
id, firma_id, abteilungsname , Land



In 98% der fällen ist es nur so das Firmenname == Abteilung ist, sodas hier eine Menge Overhead entsteht, den wollte ich irgendwie vermeiden. Aus diesen Grund hatte ich die Idee die erste Tabelle ( id, firmenname ) nur zu für die 2 % zu nutzen, bei denen es wirklich mehr als 1 Abteilung gibt.

Aber ich glaube ich komme nicht daran vorbei hier die beiden Tabellen parallel zu pflegen.

doerfnix

 
doerfnix
23-11-2011, 17:57 
 
Hallo,

Ich habe heute nochmal ein bisschen rumgespielt und folgende Lösung gefunden:


select *, ( ohneGruppe.kunden + gruppe.gruppen) as anzahl from
(
select land, count(id) as kunden
from kunden
where kunden.`group` is null
group by land
) as ohneGruppe
left join
(
select land, count(DISTINCT `group`) as gruppen
from kunden group by land
) as gruppe
ON (ohneGruppe.region = gruppe.region)



Ergibt dann folgendes Ergebnis :


land kunden land gruppen anzahl
D 1 D 0 1
NL 1 NL 1 2


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:57 Uhr.