über mehrere Tabellen

Salvatore R.

Neuer Benutzer
Beiträge
3
Hallo Liebe Mitglieder,
Seit mehreren Wochen beschäftige ich mich schon mit einem Problem an einem Modul meiner Applikation und komme einfach nicht ans Ziel und brauche Hilfe.

Erst mal zu der Aufgabenstellung.
Ich erteile wiederkehrende Kurse mit N Kursprodukten, zB. Januar Malen 1, Januar Malen 2, Januar Kochen 1 usw. Im Jeweiligen Kontaktprofil selektiere ich jeweils die möglichen Kurse(Kursprodukte) zB. Kochen, Stricken, Malen, diese schreibe ich in eine Tabelle (Tabelle1) für mögliche Kursteilnehmer, zB. Kontakt 87 Kursprodukt 17, Kontakt 87 Kursprodukt 23 usw.

Für einen Kurszeilnehmer ist der Kurs erst abgeschlossen wenn er alle Module des ensprechenden Kurses beendet hat.

Nun zu den Kursen Tabelle Courses.
Es gibt mehrere Optionen bei den Kursen, neuen Kurs erstellen und Teilnehmer hinzufügen, bestehenden Kurs editieren und Teilnehmer hinzufügen oder entfernen, Kurs am laufen oder Kurs abgeschlossen. Um die möglichen Kurskandidaten zu sehen schaue ich in Tabelle1, schreibe dann die selektierten oder entferne die unselektierten Teilnehmer mit der jeweiligen Kursnummer in der Tabelle (CourseSubscribers) zB. Kontakt 87, Kurs 324 und gleichzeitig schreibe ich in eine Tabelle welcher Kurszeilnehmer welche Kurse besucht (Tabelle3) und deren Status des Kurses, zB. angemeldet, abgeschlossen, oder nicht abgeschlossen.
Informationen für das eigentliche Kursprodukt stehen in den Produkttabellen. Somit auch die Anzahl Module des jeweiligen Kursproduktes

Die KursModule CourseUnits (noch nicht unbedingt relevant, später jedoch schon)
Jeder Kurs hat N-Kursmodule zB. Sticken Januar 1, hat 4 Module, Stricken1, 2 usw.. Im jeweiligen Modul werden mir die eingeschriebenen Kursteilnehmer wieder angezeigt. Hier definiere ich mögliche Absenzen des Moduls und schreibe diese in eine Tabelle Absenzen (Tabelle4), Kursnummer, Kontakt, KursModul usw. Diese Informationen schreibe ich in eine weitere Tabelle5. Diese ist mit Tabelle3 verknüpft. Hat ein Kursteilnehmer alle Module dieses Kurses besucht und keine Absenzen produziert, gilt die Ausbildung als abgeschlossen, dies trage ich dann in Tabelle 3 als abgeschlossen ein, ansonsten als nicht abgeschlossen.

Ob dieser Weg der richtige ist weiss ich nicht, aber diese Struktur besteht und läuft


Nun das eigentliche Problem mit den Kurszeilnehmern.

Erstellen eines Kurses
Es müssen alle Kandidaten für dieses Kursprodukt gezeigt werden die noch keinen Kurs (Kursprodukt) besucht haben, oder Kandidaten die in anderen Kursen dieses Kursproduktes, Absenzen produziert haben, aber nur die Absenzen, die die fehlenden Module noch nicht nachgeholt haben.

Editieren eines Kurses
Es müssen alle Kandidaten gezeigt werden die für diesen Kurs Angemeldet sind, neue Kandidaten und Kandidaten die Absenzen produziert haben, aber das Kursprodukt noch nicht abgeschlossen resp. nachgeholt haben.

nach dem schliessen eines Kurses (heisst nicht, dass es für de Kursteilnehmer abgeschlossen ist)
Nur die Kandidaten die angemeldet sind/waren, egal ob sie Absenzen produziert haben oder nicht.

Ich habe schon viele Query Varianten ausprobiert, mal sehe ich keine Nachholer, mal keine Neuen, mal doppelte mal gar keine.

Ich brauche also ein Query das diese Bedürfnisse abdeckt, komme aber nicht drauf wie.

-----------------------------------------------------------------------------------
Hier mal eine Variante.

SELECT
DSFC.ContactID,
Contact,
DSFC.CourseProductID,
CS.CourseID,
C.CourseID,
C.CourseProductID,
DSC.ContactID,
DSC.ContactCourseStatus,
DSC.CourseID


FROM Tabelle1 AS DSFC



LEFT JOIN CourseSubscribers AS CS ON (DSFC.ContactID = CS.ContactID)

LEFT JOIN Courses AS C ON (DSFC.CourseProductID = C.CourseProductID) AND CS.CourseID = C.CourseID

LEFT JOIN Tabelle3 AS DSC ON (CS.ContactID = DSC.ContactID) AND CS.CourseID = DSC.CourseID

WHERE
(
CASE

WHEN DSC.CourseID = CS.CourseID THEN DSC.CourseID = '{CourseID}' ELSE
DSFC.ContactID IS NOT NULL AND (DSC.ContactCourseStatus IS NULL OR DSC.ContactCourseStatus = 2)
END
)

AND
DSFC.CourseProductID = '{CourseProductID}'

-------------------------------------------

Bei dieser Variante (was bis jetzt die Beste ist), sehe ich nach abschluss des Kurses, auch die, die noch nie angemeldet waren, jedoch bei einem neuen Kurs, die Nachholer nicht. Wenn das erledigt wäre, wäre ich schon glücklich.

Ich hoffe, ich habe das Bedürfniss einigermassen verständlich geschildert.

Über Eure Hilfe würde ich mich freuen, auch für andere Lösungswege und Vorschläge wäre ich natürlich offen.


Kommentar
'{}' sind '{Variablen}'

Bei dieser Variante fehlt das vergleichen der anzahl Module der Tabelle3 mit den defienierten anzahl Module im Kursprodukt.
 
Werbung:
Hallo akretschmer,
Das verstehe ich, vermutlich liegts auch an der Erläuterung.
Ich füge mal ein PDF bei, mal schauen ob ichs besser erklären konnte.
 

Anhänge

  • Tabels-of-Content.pdf
    338,6 KB · Aufrufe: 1
Nachtrag
mal noch mit Screenshots
Herzlichen Dank, dass Du mir helfen möchtest. Aber wenn Du keine Lust hast Zeit zu investieren, verstehe ich das. Ich sehe das nicht als gegeben.
lg Salvatore
 

Anhänge

  • Tabels-of-Content.pdf
    361 KB · Aufrufe: 2
Werbung:
tl;dr.

Du hast offenbar (vereinfacht) sowas:

Code:
test=*# select * from teilnehmer ;
id |  name
----+--------------
  1 | teilnehmer 1
  2 | teilnehmer 2
  3 | teilnehmer 3
  4 | teilnehmer 4
(4 rows)

test=*# select * from kurse ;
id | name
----+-------
  1 | kurs1
  2 | kurs2
  3 | kurs3
(3 rows)

test=*# select * from kursmodule ;
id | kurs |  name
----+------+--------------
  1 |  1 | kurs1 modul1
  2 |  1 | kurs1 modul2
  3 |  1 | kurs1 modul3
  4 |  2 | kurs2 modul1
  5 |  2 | kurs2 modul2
  6 |  2 | kurs2 modul3
  7 |  3 | kurs3 modul1
(7 rows)

test=*# select * from teilgenommen ;
teilnehmer | kurs | modul
------------+------+-------
  1 |  1 |  1
  1 |  1 |  2
  1 |  1 |  3
  1 |  2 |  4
  2 |  2 |  4
(5 rows)

Welcher Teilnehmer hat Kurse vollständig besucht?

Code:
test=*# with kurse_module as (select kurs, array_agg(id) as m from kursmodule group by kurs), bisher as (select teilnehmer, kurs, array_agg(modul) as m from teilgenommen group by teilnehmer, kurs) select teilnehmer, kurs from bisher left join kurse_module using (kurs) where bisher.m  @> kurse_module.m;
teilnehmer | kurs
------------+------
  1 |  1
(1 row)

Welche Kurse wurden angefangen, sind aber noch nicht vollständig besucht?

Code:
test=*# with kurse_module as (select kurs, array_agg(id) as m from kursmodule group by kurs), bisher as (select teilnehmer, kurs, array_agg(modul) as m from teilgenommen group by teilnehmer, kurs) select teilnehmer, kurs from bisher left join kurse_module using (kurs) where bisher.m  < kurse_module.m;
teilnehmer | kurs
------------+------
  2 |  2
  1 |  2
(2 rows)

Welche Kurse mit welchen Modulen gibt es überhaupt?

Code:
test=*# select kurse.name, string_agg(kursmodule.name,', ') from kursmodule left join kurse on kursmodule.kurs=kurse.id group by kurse.name;
name  |  string_agg
-------+------------------------------------------
kurs1 | kurs1 modul1, kurs1 modul2, kurs1 modul3
kurs3 | kurs3 modul1
kurs2 | kurs2 modul1, kurs2 modul2, kurs2 modul3
(3 rows)

Kann man nun episch so fortsetzen.

Ich verwende PostgreSQL, das wird so nicht so ohne weiteres mit MySQL reproduzierbar sein. Insbesondere fehlen da die Möglichkeiten, mit Arrays zu arbeiten.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben