Anfängerfrage

struppi2010

Neuer Benutzer
Beiträge
4
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:)
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
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
 

thomas_w

Datenbank-Guru
Beiträge
104
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
 

Charly

Datenbank-Guru
Beiträge
306
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
 

struppi2010

Neuer Benutzer
Beiträge
4
AW: Anfängerfrage

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

struppi2010

Neuer Benutzer
Beiträge
4
AW: Anfängerfrage

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

thomas_w

Datenbank-Guru
Beiträge
104
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
 
Werbung:

struppi2010

Neuer Benutzer
Beiträge
4
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.
 
Oben