Datenbank Struktur, Gruppen, Auswerten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbank Struktur, Gruppen, Auswerten

    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

  • #2
    SELECT Land, COUNT(DISTINCT Gruppe) FROM fam GROUP BY Land

    Kommentar


    • #3
      Das Funktioniert nicht , beim oben genannten Beispiel würde

      D 0 NL 1



      herauskommen. Das habe ich auch schon probiert

      Kommentar


      • #4
        Also für mich sieht das Ergebnis korrekt aus.

        Kommentar


        • #5
          Das korrekte Ergebnis müßte lauten : D 1 NL 2

          Kommentar


          • #6
            Warum?

            Kommentar


            • #7
              1 Karl Muster[COLOR=Red] NULL [/COLOR]D -> 1 * D
              2 Jens Schmidt [COLOR=Red]1[/COLOR] NL -> 1 * NL
              3 Tanja Schmidt [COLOR=Red]1[/COLOR] NL -> doppelt, gehört zu id 2
              4 Gustav Schmidt [COLOR=Red] NULL [/COLOR]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 :
              1. Abt. Holz
              2. 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

              Kommentar


              • #8
                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?

                Kommentar


                • #9
                  Die Firma ist unser Kunde, also kann hier eine Tabelle wegfallen.

                  PHP-Code:
                  firma:
                  idfirmenname   

                  abteilung
                  :
                  idfirma_idabteilungsname ,  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

                  Kommentar


                  • #10
                    Hallo,

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

                    PHP-Code:
                    select *, ( ohneGruppe.kunden gruppe.gruppen) as anzahl from 
                       
                    (
                        
                    select landcount(id) as kunden 
                          from kunden 
                          where kunden
                    .`groupis null 
                          group by land
                       
                    ) as ohneGruppe
                       left join 
                       

                        
                    select landcount(DISTINCT `group`) as gruppen 
                        from kunden group by land
                       
                    ) as gruppe 
                       ON 
                    (ohneGruppe.region gruppe.region
                    Ergibt dann folgendes Ergebnis :

                    PHP-Code:
                    land   kunden   land  gruppen   anzahl    
                      D        1         D         0          1
                      NL       1         NL       1          2 
                    Zuletzt geändert von doerfnix; 23.11.2011, 17:00. Grund: Text Formatiert

                    Kommentar

                    Lädt...
                    X