【问题标题】:SQL Query - count - maxSQL 查询 - 计数 - 最大值
【发布时间】:2012-01-09 04:45:26
【问题描述】:

我无法针对问题提出查询。我有三张桌子

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));

我的问题是:里斯本数量最多的研究所的疾病名称是什么(里斯本从institute 请求city)。这是我想出的,但它没有给我正确的答案。

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。

现在假设疾病 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

);

【问题讨论】:

  • 天哪,你需要告诉我该怎么做
  • 请重新表述您的问题。我不明白你到底需要什么。
  • 一个研究所研究一种疾病。想象一下里斯本研究最多疾病的研究所。使 X 这个数量的疾病。我需要里斯本的 X 研究所正在研究的疾病的名称。所以我得到一张桌子 (D.name, X)
  • 如果您包含示例数据和预期结果会有所帮助。

标签: sql join count max


【解决方案1】:

只是粗略猜测你需要什么:

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;

这会为您提供一份疾病列表以及进行此操作的葡京机构的数量。

不幸的是,您的问题留下了很大的空间来猜测您需要什么——也许您应该添加一些示例数据和预期结果。

【讨论】:

    【解决方案2】:

    这将返回在里斯本设有机构的疾病名称列表,从里斯本机构数量最多的机构开始,然后依次递减:

    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
    

    【讨论】:

      【解决方案3】:

      我不太了解结构/问题,但我确实看到您正在混合连接并且有一个交叉连接,这会增加记录的数量。

      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)
      

      【讨论】:

      • 你写的是里斯本而不是里斯本。如果您的葡萄牙语是葡萄牙语的问题:Quais os nomes das Doenças estudadas pelo maior número de Institutos de Lisboa? Pretende-se uma lista com o nome da Doença e o n.º Exacto de Institutos que estudam essa doença。 (这是我刚刚翻译成英文的确切问题)
      • 这在我看来是正确的答案,但它并没有给我正确的结果 X(它必须接近这个......我试着做一点实验
      猜你喜欢
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多