[英]SQL Query - count - max
我無法設法查詢問題。 我有三張桌子
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));
我的問題是:由單位從里斯本數量最多哪些deseases的名稱(里斯本beeng的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(僅用於演示目的,我知道類型是INT); 5名疾病的名稱分別為Z,X,N,V,M。
現在假設由研究所A,B,C(以任何順序)研究Z,X和M,通過D(1 inst。)研究desease N,並且通過E(僅一個)研究desease V. 因此,任何里斯本研究所研究的最大數量是3(A,B和C所有研究3 deseases)所以表格看起來像這樣
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
);
我不太了解結構/問題,但我確實看到你正在混合連接並且有一個交叉連接會增加recrds的數量。
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)
只是粗略猜測你需要什么:
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;
這給你一個desease列表和Lisboa instutitues的數量。
不幸的是,你的問題留下了很多猜測你需要什么的空間 - 也許你應該添加一些示例數據和預期結果。
這將返回一份在里斯本擁有一所研究所的疾病名單,從里斯本研究所數量最多的研究所開始下降:
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
如果您只需要具有最多機構的那個並且您需要desease表中的其余列,則可以執行此操作(在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.