2015-12-17 2 views
0

У меня есть база данных научных конференций.Проблемы с MySQL вложенных запросов и оптимизации

  • Conferencis, проведенные в universitis
  • Каждый студент может посещать любые конференции.
  • Каждого университета имеет мало учащегося

CREATE TABLE uni #University 
(
    region   varchar(255) NOT NULL, 
    name   varchar(255) NOT NULL, 
    id    int unsigned NOT NULL auto_increment,  
    PRIMARY KEY  (id) 
); 

CREATE TABLE student 
(
    uni_id   int unsigned NOT NULL, 
    name   varchar(255) NOT NULL, 
    id    int unsigned NOT NULL auto_increment, 
    PRIMARY KEY  (id), 
    FOREIGN KEY (uni_id) REFERENCES uni (id) 
); 

CREATE TABLE conf #Conference 
(
    uni_id   int unsigned NOT NULL, 
    name   varchar(255) NOT NULL, 
    id    int unsigned NOT NULL auto_increment, 
    PRIMARY KEY  (id), 
    FOREIGN KEY  (uni_id) REFERENCES uni (id) 
); 


CREATE TABLE visits #table participants 
# id_student visit conference id_conf and maybe have winnner place 
(
    id_conf   int unsigned NOT NULL, 
    id_student  int unsigned NOT NULL, 
    place   int unsigned, #1..3 
    PRIMARY KEY  (id_conf, id_student), 

    FOREIGN KEY (id_conf) REFERENCES conf (id), 
    FOREIGN KEY (id_student) REFERENCES student (id) 
); 

мне нужно, код 5 выберите запросы:

1) получают имена студентов, которые посещают конференцию "База данных 2015"

SELECT vc.name FROM 
    (SELECT * FROM visits v 
     INNER JOIN conf c 
     ON (v.id_conf = c.id)) vC# visits with names of conference 
    INNER JOIN student s 
    ON (vc.id_student = s.id) 
    WHERE vc.name = "DataBase 2015"; 

2) получить идентификатор unisersities, в котором учащиеся имеют победителей на конференции «DataBase 2015»

SELECT DISTINCT uni_id 
    FROM student s 
    INNER JOIN 
      (SELECT id_student 
        FROM visits v 
        INNER JOIN conf c 
        ON (v.id_conf = c.id) 
        WHERE (v.place is NOT NULL and 
         c.name = "DataBase 2015") 
      ) winers 
    ON (winers.id = i.id_student); 

3) Получить университет идентификатор, где провел более 1 конференции

SELECT uni_id FROM conf c GROUP BY c.uni_id having COUNT(*) > 1; 

4) Получить университет, который студенту иметь места во всех конференциях. Это означает, что нам нужно сравнить количество всех конференций и ряд конференций, в которых студенты некоторых универа имеют какой-либо выигрыш место

Нужна написать что-то вроде этого (Java):

uni_list.stream().filter(uni -> { 
     Set<Conference> id_have_winners = new new HashSet<>; 
     for(Student s : getStudents(uni.getId()) { 
      for(Conference c : conferences) { 
       if (studentWinConference(s, c) 
        id_have_winners.put(c); 
     } 
     bool haveWinnersInAllConferences = id_have_winners.size() == conferences.size(); 
     return haveWinnersInAllConferences; 
} 

5) получить Uni которых студенты посетите только одну конференцию.

SELECT id_conf, id_student, uni_id FROM 
    visits v INNER JOIN student s ON (s.id = v.id_student) GROUP BY s.uni_id having COUNT(v.id_conf) = 1 

6) получить Uni, которые студенты посещают некоторые конференции, но никто не выиграл


1, 2, 3 являются работы, но мне нужно сouncil для возможных упрощений; 4, 5, 6 is hard и я буду рад любым советам или кодам.

+0

Какой SQL у вас есть для части 4, 5 и 6? См. [Этот последний ответ] (http://stackoverflow.com/a/34327197/3404097). – philipxy

+0

@philipxy Я не знаю, как код 4, 5, 6. Нужна помощь или инструкции с ним – punksta

+0

Для 1,2,3: ни один из этих подзапросов не требуется. Вам просто нужны регулярные соединения с соответствующими фильтрами в предложении WHERE. Для 4,5,6: просмотрите агрегированные запросы. – Rabbit

ответ

1

Попробуйте эти запросы. Вы можете добавить некоторые данные к примеру http://sqlfiddle.com/#!9/12247/16 и сообщить мне, если что-то не работает. Включите также ожидаемый результат.

Имя студентов, которые посещают конференцию "DataBase 2015"

select distinct s.name 
from visits v 
inner join conf c on v.id_conf = c.id 
inner join student s on v.id_student = s.id 
where c.name = 'DataBase 2015' 

ID университетов с выигрышными студентов на "DataBase 2015"

select distinct u.id 
from visits v 
inner join conf c on v.id_conf = c.id 
inner join student s on v.id_student = s.id 
inner join uni u on s.uni_id = u.id 
where place is not null 
and c.name = 'Database 2015' 

университета ID, где более 1 конференция была проведена

select uni_id 
from conf 
group by uni_id 
having count(*) > 1 

университета со студентами, расположенных во всех конференциях

select distinct s.uni_id 
from student s 
left join (
    select id_conf, id_student, uni_id 
    from visits v 
    inner join conf c on v.id_conf = c.id 
    where place is not null 
) data on data.id_student = s.id and data.uni_id = s.uni_id 
where data.id_student is not null 

Студенты университета посетили только одну конференцию

select s.uni_id 
from visits v 
inner join conf c on v.id_conf = c.id 
inner join student s on v.id_student = s.id 
group by s.uni_id 
having count(*) = 1 

университета, чьи студенты не были помещены

select distinct s.uni_id 
from student s 
left join (
    select id_conf, id_student, uni_id 
    from visits v 
    inner join conf c on v.id_conf = c.id 
    where place is null 
) data on data.id_student = s.id and data.uni_id = s.uni_id 
where data.id_student is not null 
Смежные вопросы