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