SQL-запрос - количество - макс - PullRequest
3 голосов
/ 30 ноября 2011

Мне не удается найти запрос на проблему. У меня три стола

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

);

Ответы [ 3 ]

0 голосов
/ 30 ноября 2011

Просто грубое предположение, что вам нужно:

SELECT stu.iid, COUNT(*) AS nstudies
FROM studies stu, institute ins
WHERE stu.iid=ins.iid
AND ins.city='Lisboa'
GROUP BY stu.iid
ORDER BY nstudies DESC;

Это должно дать вам список институтов, которые находятся в Лиссабоне, и количество исследований, которые они провели.

SELECT stu.did, COUNT(*) AS ninst
FROM studies stu, institute ins, disease dis
WHERE stu.iid=ins.iid
AND stu.did=dis.did
AND ins.city='Lisboa'
GROUP BY stu.did
ORDER BY ninst DESC;

Это дает вам список заболеваний и количество Lisboa instutitues, которые сделали это.

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

0 голосов
/ 30 ноября 2011

Это вернет список названий болезней, в которых есть институт в Лиссабоне, начиная с того, который имеет наибольшее количество институтов в Лиссабоне и заканчивая:

SELECT D.name, COUNT(*) as numberOfInstitutes
FROM desease D
INNER JOIN studies S ON D.did=S.did
INNER JOIN institute I ON (S.iid = I.iid)
WHERE I.city = 'Lisbon'
GROUP BY D.did
ORDER BY COUNT(*) desc

Если вам нужен только тот, в котором больше всего институтов, и вам нужны остальные столбцы из таблицы заболеваемости, вы можете сделать это (на Sql Server):

SELECT TOP 1 D.* 
FROM desease D
INNER JOIN
(
    SELECT D.did, COUNT(*) as numberOfInstitutes
    FROM desease D
    INNER JOIN studies S ON D.did=S.did
    INNER JOIN institute I ON (S.iid = I.iid)
    WHERE I.city = 'Lisbon'
    GROUP BY D.did
) as tblCount on tblCount.did = D.did
ORDER BY numberOfInstitutes desc
0 голосов
/ 30 ноября 2011

Я недостаточно хорошо понимаю структуру / проблему, но я видел, что вы смешивали объединения и имели перекрестное соединение, которое увеличивало бы число записей.

SELECT DISTINCT D.name, MAX(I.iid)
FROM desease D
INNER JOIN  studies S ON D.iid=S.Did
INNER 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...