2016-07-23 6 views
2

Ich habe die Tabellen: Users(id,name,...), Knowledge(id,name,...) und Courses(id,name....). Jeder Benutzer verfügt über mehrere "Kenntnisse" (Benutzer- und Wissensverknüpfungen nach Typ ManyToMany). Zum Beispiel Benutzer "Benutzer1" haben 2 Wissen "1" und "2". Kurs auch Verknüpfung mit Wissen nach Typ ManyToMany. Aber Wissen in diesem Fall ist Voraussetzung. Zum Beispiel erfordert der Kurs "Kurs 1" das Wissen "1" und "2" und der Benutzer kann für diesen Kurs zugreifen. Kurs "Kurs 2" benötigt Kenntnisse "1" und "3", und Benutzer haben keinen Zugang für diesen Kurs.Wie schreibe ich richtige SQL-Anfrage für meine Aufgabe

Ich möchte korrekte SQL-Befehl schreiben, die alle Kurse zurückgegeben, die Benutzer erhalten können. Ich benutze PostgresSQL. Entschuldigung für mein schreckliches Englisch.

habe ich versucht, diese SQL-Befehl für den Kurs und Wissen verbinden:

select c.id as "Course id", k.requiredknowledge_id from course as c inner join courses_required_knowledges as k on k.course_id = c.id; 

einen ähnlichen Befehl für Benutzer und Wissen verbinden.

select u.id as "User id", k.knowledge_id from user_info as u inner join users_knowledge as k on k.userInfo_id = u.id where u.id = 1; 

Aber ich verstehe nicht, wie man „combain“ diese Befehle für get Ergebnis

+1

Bitte zeigen Sie, was Sie bisher versucht haben. – Serg

+1

Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an. Kennzeichnen Sie die Frage auch mit der von Ihnen verwendeten Datenbank. –

+0

ich denke, vielleicht Concat Spalten Werte (Gruppe von) und vergleichen Sie –

Antwort

0
select c.id as "Course", array_agg(k.requiredknowledge_id) as "Requiried knoweldge" , array_agg(uk.knowledge_id) as "User Knowledge" 
from course as c 
right join courses_required_knowledges as k on k.course_id = c.id 
right join users_knowledge as uk on uk.userInfo_id = 1 
group by c.id 
having array_agg(k.requiredknowledge_id) <@ array_agg(uk.knowledge_id); 

Dieses Beispiel Arbeit für mich.

0

Du bist wahrscheinlich für so etwas suchen.

Lassen Sie uns zunächst einige Testdaten erstellen:

create table course (id int primary key, name varchar(20)); 
insert into course (id, name) values 
(1,'cooking'), 
(2,'super hero'), 
(3,'otaku'); 

create table knowledge (id int primary key, name varchar(30)); 
insert into knowledge (id, name) values 
(4,'boil egg'), 
(5,'toast bread'), 
(6,'maintain secret identity'), 
(7,'read'); 

create table courses_required_knowledges (id int primary key, course_id int, requiredknowledge_id int); 
insert into courses_required_knowledges (id, course_id, requiredknowledge_id) values 
(8,1,4), 
(9,1,5), 
(10,2,6), 
(11,3,7); 

create table user_info (id int primary key, name varchar(20)); 
insert into user_info (id, name) values 
(12,'John Doe'), 
(13,'Konata'), 
(14,'Mega Mindy'); 

create table users_knowledge (id serial primary key, userInfo_id int, knowledge_id int); 
insert into users_knowledge (userInfo_id, knowledge_id) values 
(12,4), 
(12,7), 
(12,5), 
(13,7), 
(14,6), 
(14,7), 
(14,5); 

Die Abfrage unter ihnen auf die entsprechenden Felder verbindet.
Mit dem Benutzer Tabelle Kreuz verbunden (alle zu allen) zu den erforderlichen Kurse.

select 
-- course.id as course_id, 
-- coursereq.requiredknowledge_id, 
-- user_info.id as user_id, 
course.name as course, 
reqknow.name as required_knowledge, 
user_info.name as username, 
(case when users_knowledge.id is null then 'N' else 'Y' end) as user_meets_requirement 
from courses_required_knowledges as coursereq 
full outer join user_info on (1=1) 
left join users_knowledge 
    on (user_info.id = users_knowledge.userInfo_id and 
     coursereq.requiredknowledge_id = users_knowledge.knowledge_id) 
left join knowledge as reqknow 
    on (coursereq.requiredknowledge_id = reqknow.id) 
-- left join knowledge as usrknow 
-- on (users_knowledge.knowledge_id = usrknow.id) 
left join course 
    on (coursereq.course_id = course.id) 
where users_knowledge.id is null 
order by 
course.name, reqknow.name, user_info.name; 

Das gibt die Anforderungen, die von den Benutzern verpasst werden, um sich in einem Kurs anzumelden.

Ergebnis:

course  required_knowledge  username user_meets_requirement 

cooking  boil egg     Konata  N 
cooking  boil egg     Mega Mindy N 
cooking  toast bread    Konata  N 
super hero maintain secret identity John Doe N 
super hero maintain secret identity Konata  N 
+0

Vielen Dank für Ihre Antwort, aber ich habe großen Fehler in Frage Tabellen Link von ManyToMany. Ich werde meine Frage bearbeiten –

+0

Ich hatte etwas Spaß mit den Namen. – LukStorms

Verwandte Themen