====== Tabellen der Aufgaben-Datenbank ======
=== Benutzer ===
^Benutzer ^ Typ ^
|__b_benutzername__ | varchar(30) |
|b_kennwort | varchar(100) |
|b_vollname | varchar(100) |
=== Aufgaben ===
^Aufgaben ^ Typ ^
|__a_id__ | int (11) |
|f_kuerzel | varchar(3) |
|a_name | varchar(100) |
|a_latexcode | text |
|j_id | int(11) |
|b_benutzername | varchar(?) |
|a_creationdate | Datetime |
|a_editdate |timestamp |
=== Jahrgänge ===
^Jahrgaenge ^ Typ ^
|__j_id__ | int(11)|
|j_name | varchar(10)|
|j_sort | int(11)|
=== Fächer ===
^Faecher ^Typ^
|f_name | varchar(20)|
|__f_kuerzel__ | varchar(3)|
=== Themen ===
^Themen ^ Typ ^
|__t_id__ | int(11)|
|t_name | varchar(50)|
|f_kuerzel | varchar(3)|
=== Aufgaben und Themen ===
^A_T ^ Typ ^
|__a_t_id__ | int(11)|
|a_id | int(11)|
|t_id | int(11)|
=== Aufgaben und Jahrgänge ===
^A_J ^ Typ ^
|__a_j_id__ | int(11)|
|a_id | int(11)|
|j_id | int(11)|
==== SQL-Abfragen ====
SELECT *
FROM A_T at, Aufgaben a, A_J
WHERE (
at.t_id =2
OR at.t_id =5
)
AND a.a_id = at.a_id
AND a.a_id = A_J.a_id
AND at.a_id = A_J.a_id
AND a.a_id
IN (
SELECT aj.a_id
FROM A_J AS aj
WHERE aj.j_id =5
OR aj.j_id =4
)
GROUP BY a.a_id
LIMIT 0 , 30
Welchen Sinn macht "ODER" in der Aufgaben-Auswahl? Ich würde Themenwahl und Jahrgangswahl eigentlich immer mit UND verknüpfen. Wenn ich dann nur nach Themen suche, steht Jahrgänge auf "alle".
Beispiel (lang): Suche Optik-Aufgaben für Klassen 8 oder 9:
SELECT * FROM ((((Aufgaben
INNER JOIN A_T ON Aufgaben.a_id = A_T.a_id)
INNER JOIN Themen ON A_T.t_id = Themen.t_id)
INNER JOIN A_J ON Aufgaben.a_id = A_J.a_id)
INNER JOIN Jahrgaenge ON A_J.j_id = Jahrgaenge.j_id)
WHERE
Themen.t_name = 'Optik'
AND
(Jahrgaenge.j_name = '8' OR Jahrgaenge.j_name = '9')
oder kürzer über die IDs:
SELECT * FROM ((Aufgaben
INNER JOIN A_T ON Aufgaben.a_id = A_T.a_id)
INNER JOIN A_J ON Aufgaben.a_id = A_J.a_id)
WHERE
A_T.t_id = 5
AND
(A_J.j_id = 4 OR A_J.j_id = 5)
Zum Anzeigen innerhalb eines Themenblocks ohne Dubletten (hier nur Aufgaben-Name):
SELECT DISTINCT Aufgaben.a_name FROM ((Aufgaben
INNER JOIN A_T ON Aufgaben.a_id = A_T.a_id)
INNER JOIN A_J ON Aufgaben.a_id = A_J.a_id)
WHERE
A_T.t_id = 5
AND
(A_J.j_id = 4 OR A_J.j_id = 5)
Eingebaute Abfrage im Aufgaben-Overview
SELECT DISTINCT at.t_id, at.a_id, a.a_id, a.a_name, t.t_id, t.t_name, a.b_benutzername
FROM (((Aufgaben AS a
INNER JOIN A_T AS at ON a.a_id = at.a_id)
INNER JOIN Themen AS t ON at.t_id = t.t_id)
INNER JOIN A_J AS aj ON a.a_id = aj.a_id)
WHERE at.t_id = 38
AND
(aj.j_id = -1 OR aj.j_id = 1 OR aj.j_id = 2 OR aj.j_id = 3 OR aj.j_id = 4 OR aj.j_id = 5 OR aj.j_id = 6 OR aj.j_id = 7 OR aj.j_id = 8 OR aj.j_id = 9)
ORDER BY a.a_name