Мне не удается найти запрос на проблему. У меня три стола
CREATE TABLE institute (
iid INT PRIMARY KEY,
sign VARCHAR(127) UNIQUE,
city VARCHAR(127) NOT NULL,
area INT CHECK (area>0));
CREATE TABLE desease (
did INT PRIMARY KEY,
name VARCHAR(127) UNIQUE,
level INT CHECK (level>0));
CREATE TABLE studies (
did INT,
iid INT,
FOREIGN KEY (did) REFERENCES desease (did),
FOREIGN KEY (iid) REFERENCES institute (iid),
PRIMARY KEY (iid,did));
Мой вопрос таков: как называются заболевания, отмеченные наибольшим числом институтов из Лиссабона (Лиссабон был city
из institute
). Это то, что я придумал, но это не дает мне правильный ответ.
SELECT DISTINCT D.name, MAX(I.iid)
FROM desease D, studies S
JOIN institute I ON (S.iid = I.iid)
WHERE I.city = 'Lisboa' AND D.did = S.did
GROUP BY D.nome
HAVING COUNT(I.iid) = MAX(I.city)
В качестве примера: представьте, что 5 институтов al с city = 'Lisbon' и соответственно с iid A, B, C, D, E (только для демонстрационных целей, я знаю, что type это INT); 5 Заболевания с именем = Z, X, N, V, M соответственно.
Теперь допустим, что заболевание Z, X и M изучается институтами A, B, C (в любом порядке), заболевание N изучается D (1 инст.), А заболевание V изучается E (только один) , Таким образом, максимальное количество заболеваний, изучаемых любым лиссабонским институтом, равно 3 (A, B и C все изучают 3 заболевания), поэтому таблица будет выглядеть следующим образом
Z - 3
X - 3
M - 3
Редактировать: мне удалось найти способ сделать это. Вот запрос, который я придумал
SELECT DISTINCT D.name, COUNT(*) AS C
FROM desease D, studies E, institute I
WHERE I.iid = E.iid AND D.did = E.did AND I.city = "Lisboa"
GROUP BY D.name
HAVING C >= ALL (
SELECT COUNT(*)
FROM desease D, studies E, institute I
WHERE I.iid = E.iid AND D.did = E.did AND I.cidade = "Lisboa"
GROUP BY D.name
);