У меня есть база данных научных конференций.Проблемы с 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 и я буду рад любым советам или кодам.
Какой SQL у вас есть для части 4, 5 и 6? См. [Этот последний ответ] (http://stackoverflow.com/a/34327197/3404097). – philipxy
@philipxy Я не знаю, как код 4, 5, 6. Нужна помощь или инструкции с ним – punksta
Для 1,2,3: ни один из этих подзапросов не требуется. Вам просто нужны регулярные соединения с соответствующими фильтрами в предложении WHERE. Для 4,5,6: просмотрите агрегированные запросы. – Rabbit