1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Anfängerfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von struppi2010, 3 Dezember 2010.

  1. struppi2010

    struppi2010 Neuer Benutzer

    Habe nun, ach, ein SQL-Buch (für Dummies) durchaus studiert und muss nun das Programm "Dienstliste" (bisher dbf Dateien) fürs Netz in PHP und MySQL schreiben.
    2 Tabellen: Mitarbeiter (ID=INT AUTOINCREMENT,name= VARCHAR)
    Dienstliste2011 (datum=DATE, hauptdienst, beidienst, kinderdienst = alle INT mit Bezug auf "Mitarbeiter")
    Im Ergebnis sollen das Datum und die Namen, die an diesem Tag Dienst haben, für die einzelnen Monate aufgelistet werden. Wie könnte die Abfrage ausschauen?

    Ich glaub ich habe einen Knopf im Hirn:)
     
  2. Charly

    Charly Datenbank-Guru

    AW: Anfängerfrage

    Hallo struppi2010,

    das könnte in etwa so gehen:

    Code:
     
    SELECT 
     M.Name,
     MONTH(D.Datum) AS Monat,
     DAY (D.Datum) AS Tag,
     SUM (hauptdienst) AS Hauptdienst,
     SUM (beidienst) AS Beidienst,
     SUM (Kinderdienst) AS Kinderdienst 
    FROM Mitarbeiter M
    JOIN Dienstliste D ON M.ID=D.Mitarbeiter
    GROUP BY MONTH(D.Datum),M.Name,D.Datum
    WITH ROLLUP
    ORDER BY MONTH(D.Datum)DESC
    
    Ich habe gerade keinen mySQL da und habe das im Texteditor geschrieben. Testdaten habe ich auch keine. Deshalb kann es sein das sich da noch Fehler eingeschlichen haben.

    Der Weg sollte aber klar sein.

    Gruß Charly
     
  3. thomas_w

    thomas_w Datenbank-Guru

    AW: Anfängerfrage

    Ein Beispiel mit Testdaten ...

    Code:
    CREATE TABLE mitarbeiter (
     id INT NOT NULL,
     name VARCHAR(50),
     PRIMARY KEY (id)
    );
     
    INSERT INTO mitarbeiter VALUES
    ( 1, 'Mustermann' ),
    ( 2, 'Musterfrau' ),
    ( 3, 'ohne Muster' );
     
    CREATE TABLE dienstliste2011 (
     datum DATE NOT NULL,
     hauptdienst INT ,
     beidienst INT,
     kinderdienst INT
    );
    INSERT INTO dienstliste2011 VALUES
    ( '2010-10-01', 1, 2, 3 );
     
    SELECT d.datum, 
          ( SELECT name FROM mitarbeiter
             WHERE id = d.hauptdienst
          ) AS hauptdienst,
          ( SELECT name FROM mitarbeiter
             WHERE id = d.beidienst
          ) AS beidienst,      
          ( SELECT name FROM mitarbeiter
             WHERE id = d.kinderdienst
          ) AS kinderdienst
      FROM dienstliste2011 d
    ORDER BY d.datum;
    +------------+-------------+------------+--------------+
    | datum      | hauptdienst | beidienst  | kinderdienst |
    +------------+-------------+------------+--------------+
    | 2010-10-01 | Mustermann  | Musterfrau | ohne Muster  |
    +------------+-------------+------------+--------------+
    1 row in set (0.01 sec)
    mysql>
    
    Allerdings hat Deine Tabelle dienstliste2011 ein Designfehler, deshalb ist der SQL auch so kompliziert.

    Grüße
    Thomas
     
  4. Charly

    Charly Datenbank-Guru

    AW: Anfängerfrage

    Hallo zusammen,

    ups. ich muss noch was erklähren.

    Ich habe für

    hauptdienst, beidienst, kinderdienst

    1 oder 0 angenommen. (1 hat Dienst, 0 hat keinen Dienst).

    Dann habe ich die Tabellen über die Mitarbeiter-ID verknüpft (FK in Diensteliste2011).

    Die SELECT sollte dann ein Ergebnis mit:

    Mitarbeiter, Monat, Tag, hauptdienst , beidienst, kinderdienst

    mit Zusammenfassung für jeden Monat und Gesamtsummen am Ende

    erzeugen.

    Wenn jemand Interesse daran hat, baue ich entsprechende Create- und Test Datensätze zusammen. Damit der Sinn der SELECT deutlich wird braucht man aber einen haufen Datensätze.

    Gruß Charly
     
  5. struppi2010

    struppi2010 Neuer Benutzer

    AW: Anfängerfrage

    Tja, habe mich wohl nicht ganz korrekt ausgedrückt, aber Danke, Danke.
    Hauptsache, es funktioniert.
    Gute Menschen in Superforum
     
  6. struppi2010

    struppi2010 Neuer Benutzer

    AW: Anfängerfrage

    Lieber thomas w
    Wie könnte das bessere Design für "dienstliste2011" ausschauen, damit die Abfrage weniger kompliziert ist?
     
  7. thomas_w

    thomas_w Datenbank-Guru

    AW: Anfängerfrage

    Die Tabelle "dienstliste2011" muss normalisiert werden. Also z.B. so:

    Code:
    /* Art der Dienste */
    CREATE TABLE dienst (
     id INT NOT NULL,
     name VARCHAR(50) NOT NULL,
     PRIMARY KEY (id)
    );
    
    INSERT INTO dienst VALUES
    ( 1, 'Hauptdienst'),
    ( 2, 'Beidienst'),
    ( 3, 'Kinderdienst');
    
    
    /* Normalisierte Dienstliste */
    CREATE TABLE dienstliste (
     id INT NOT NULL,
     datum DATE NOT NULL,
     dienst_id INT NOT NULL,
     mitarbeiter_id INT NOT NULL,
     PRIMARY KEY (id)
    );
    
    INSERT INTO dienstliste VALUES
    ( 1, '2010-10-01', 1, 1),
    ( 2, '2010-10-01', 2, 2),
    ( 3, '2010-10-01', 3, 3);
    
    SELECT dl.datum, d.name As dienst, m.name AS mitarbeiter
      FROM mitarbeiter m
      JOIN dienstliste dl
        ON dl.mitarbeiter_id = m.id
      JOIN dienst d
        ON d.id = dl.dienst_id
    ORDER BY dl.datum;
    +------------+--------------+-------------+
    | datum      | dienst       | mitarbeiter |
    +------------+--------------+-------------+
    | 2010-10-01 | Hauptdienst  | Mustermann  |
    | 2010-10-01 | Beidienst    | Musterfrau  |
    | 2010-10-01 | Kinderdienst | ohne Muster |
    +------------+--------------+-------------+
    3 rows in set (0.00 sec)
    
    mysql>
    
    
    mysql>
    
    Die Tabelle "dienste" ist neu. Das Ganze ist jetzt flexibler. Es können auch mehrere Personen für einen Dienst eingetragen werden. Es können neue Dienste ( Z. B. Kochen ) problemlos hinzukommen, ohne die Tabellenstrukturen erneut zu ändern.

    Grüße
    Thomas
     
  8. struppi2010

    struppi2010 Neuer Benutzer

    AW: Anfängerfrage

    Die erste Lösung ist praktikabel, die zweite Lösung ist perfekt.
    Ob ich mit meinen 60 Jahren noch diesen Paradigmenwechsel durchführen kann, muß ich erst schauen.
    Auf alle Fälle habe ich viel gelernt und danke herzlich.
     
Die Seite wird geladen...

Diese Seite empfehlen