2012-11-16 4 views
-1

Nous avons après 4 tables de base de donnéesQuelle devrait être la requête?

école

School_ID, School_Name 

étudiant

Student_id, School_ID, Student Name 

Cours

Course_ID, Course_Name 

Course_Student

Course_Id, Student ID 

S'il vous plaît suggérer une requête qui renvoie la liste des écoles dont chaque étudiant est inscrit à au moins 3 sujets.

+5

** S'il vous plaît d'abord nous montrer vos efforts! ** [Qu'avez-vous essayé?] (Http://www.whathaveyoutried.com) –

+0

Est-ce que ce sont des devoirs? – danihp

+0

Oh non non ... c'est juste une partie de très grosse requête (je travaille sur d'autres parties: views, triggers et storedProcedure) .Il est urgent de demander de l'aide à mes camarades de stackoverflow :) .... J'ai changé le nom des entités et leurs clés pour le rendre facilement compréhensible (je pense à cause des noms d'entité u ppl pense que c'est un devoir) –

Répondre

2

Compte tenu du schéma

CREATE TABLE School 
    (`School_ID` int, `School_Name` varchar(7)) 
; 

INSERT INTO School 
    (`School_ID`, `School_Name`) 
VALUES 
    (1, 'SchoolA'), 
    (2, 'SchoolB'), 
    (3, 'SchoolC') 
; 

CREATE TABLE Student 
    (`Student_id` int, `School_ID` int, `Student_Name` varchar(4)) 
; 

INSERT INTO Student 
    (`Student_id`, `School_ID`, `Student_Name`) 
VALUES 
    (1, 1, 'John'), 
    (2, 1, 'Alex'), 
    (3, 2, 'Lex') 
; 

CREATE TABLE Course 
    (`Course_ID` int, `Course_Name` varchar(9)) 
; 

INSERT INTO Course 
    (`Course_ID`, `Course_Name`) 
VALUES 
    (1, 'Math'), 
    (2, 'Science'), 
    (3, 'Chemistry'), 
    (4, 'Physics'), 
    (5, 'History') 
; 



CREATE TABLE Course_Student 
    (`Course_ID` int, `Student_ID` int) 
; 

INSERT INTO Course_Student 
    (`Course_ID`, `Student_ID`) 
VALUES 
    (1, 1), 
    (2, 1), 
    (3, 1), 
    (1, 2), 
    (1, 3), 
    (2, 3), 
    (4, 2), 
    (5, 2) 
; 

Le résultat attendu du schéma ci-dessus sera SchoolA parce qu'elle est la seule école qui a tous les étudiants qui sont inscrits sur atleast trois cours.

SELECT SCHOOL_ID, School_Name 
FROM 
(
    SELECT d.SCHOOL_ID, e.School_Name,e.NoOfStudents 
    FROM 
     (
      SELECT a.Student_ID, a.school_ID 
      FROM Student a 
        INNER JOIN Course_Student c 
         ON c.Student_ID = a.Student_ID 
        INNER JOIN Course d 
         ON c.Course_ID = d.Course_ID 
      GROUP BY a.Student_ID, a.school_ID 
      HAVING COUNT(*) >= 3 
     ) d INNER JOIN 
     (
      SELECT b.School_ID, b.School_Name, COUNT(*) NoOfStudents 
      FROM Student a 
        INNER JOIN School b 
         ON a.School_ID = b.School_ID 
      GROUP BY b.School_ID, b.School_Name 
     ) e ON e.School_ID = d.School_ID 
    GROUP BY d.SCHOOL_ID 
    HAVING COUNT(*) = e.NoOfStudents 
) s 
+1

Cela ne retournera que les écoles qui ont ** au moins un étudiant ** inscrit à 3 cours ou plus. Il faut un compte supplémentaire par école pour être égal au nombre total d'élèves dans cette école. – CyberDude

0
Select School_Name, Student_Name, count(Course_Student.Course_ID) as total from School 
inner join Student 
on Course_Student.School_ID = Student.School_ID 
inner join Course 
on Student.Student_Id = Course.Student_Id 
where total > 3 
group by School_Name, Student_Name 
+0

S'il vous plaît suggérer une requête qui renvoie ** la liste des écoles ** – CyberDude

+0

Cela pourrait retourner les écoles où certains des étudiants sont inscrits dans moins de trois cours. – geekchic

+1

En fait, je pense qu'il retournera une erreur: # 1054 - La colonne inconnue 'total' dans 'where clause' – Jocelyn

1
select School_name from School 
where School_ID not in (
    select School_ID from Student 
    inner join Course_Student on Student.Student_id = Course_Student.[Student ID] 
    group by Student_ID, School_ID, Course_Id 
    having Count(Course_Id) < 3) 
Questions connexes