2011-11-29 108 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