2011-11-29 111 views
3

我無法設法查詢問題。我有三個表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的cityinstitute)。這是我想出來的,但它沒有給我正確的答案。

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個院所人與城市= '里斯本' 並與IID A,B,C,d,E respectevely(只是爲了演示的目的,我知道類型是INT); 5分類名稱= Z,X,N,V,M的疾病。現在讓我們說研究Z,X和M由研究機構A,B,C(以任何順序)進行研究,研究N由D研究(1個),研究V由E研究(只有一個)。因此,通過任何里斯本學院學習deseases的最大數量爲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 

);

+0

OMG,你需要告訴怎麼做,我因子評分我將不得不這樣做,但我沒有找到在哪裏做 –

+0

http://meta.stackexchange.com/q/5 234/156331 – hochl

+0

請更改您的問題。我不明白你需要什麼。 –

回答

0

我不明白結構/問題,但我確實看到你在混合連接,並且有一個交叉連接,這會使得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) 
+0

你已經寫Lisboa而不是里斯本。如果您的葡萄牙語是葡萄牙語的問題:Quais os nomes dasDoençasestudadas pelo maiornúmerode Institutos de Lisboa? Pretende-se uma lista como nome daDoençae o n。:exacto de Institutos que estudam essadoença。 (這是我剛剛把它翻譯成英文的確切questin) –

+0

這看起來像我正確的答案,但它不給我正確的結果X(它必須是接近這個... Il嘗試一點點試驗 –

+0

而且你有沒有得到它的工作? – hochl

0

只是一個粗略的猜測你需要什麼:

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

這將返回開始與一個在里斯本機構的最大數量,走這在里斯本研究所疾病名稱的列表:

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