6

我很难解决这个问题。我正在为大学做一些复习练习,并希望在两天内考试前了解这一点。

我尝试了一些事情(我将在最后发布)。请善待,这是我的第一个数据库主题,所以我的尝试对你来说可能看起来很愚蠢。

问题如下:目前哪个艺术家/有/有最多的节目?显示艺术家的名字和姓氏及其地址。不能使用 ORDER BY 子句。编写单个 SQL 语句。使用子查询。

数据库中的相关表:

Shows (ShowName, ArtistId, ShowStartDate, ShowEndDate)
Artists (ArtistId, FirstName, FamilyName, Address, PhoneNum)

我们假设 ArtistId、ShowStartDate、FirstName、FamilyName 和 Address 不能为空。

现在,我认为我必须计算每个艺术家目前的演出数量。然后,获取拥有最多的艺术家的 ArtistId。使用 ArtistId 检索艺术家详细信息(姓名和地址)。

我做到了这一点(这是非常错误的):

SELECT FirstName, FamilyName, Address
FROM Artists
WHERE ArtistId = (SELECT ArtistId
                  FROM Shows
                  WHERE ArtistId = (SELECT MAX(Counted) 
                                    FROM (SELECT ArtistId, COUNT(ArtistId) AS Counted
                                    FROM Shows
                                    WHERE ShowEndDate IS null
                                    GROUP BY ArtistId)
                  GROUP BY ArtistId));

嗯,我知道

SELECT ArtistId, COUNT(ArtistId)
FROM Shows
WHERE ShowEndDate IS null
GROUP BY ArtistId

给我一个表格,其中列出了每个 ArtistId 被列出的次数。哪个好。但是从这个结果表中,我需要获取具有最高计数的 ArtistId/。

这就是我迷路的地方。

任何人都可以解释一下吗?

(至于我使用的是哪个 DBMS:我们必须使用由大学创建和提供的一个。它是非常基本的 SQL。比 Access 2010 更简单)。

谢谢

(如果您提供答案[谢谢谢谢],您能否还简要解释一下其背后的原因?)

4

2 回答 2

1

您需要按艺术家查找节目数量的最大值,然后通过重新运行计数查询但应用having与刚刚找到的最大值匹配的子句来找出哪些艺术家具有该计数。

select FirstName, FamilyName, Address
from Artists
where ArtistId in -- use an in() to select the artists
  (select ArtistId from -- just select the artist id from the results
    (select ArtistId, count(*) c -- re-run the count query, but see having clause
     from Shows
     where current_date between ShowStartDate and ShowEndDate
     group by ArtistId
     having count(*) = -- use a having clause to only select those with the max count
      (select max(c) from -- this is simply the maximum count
        (select ArtistId, count(*) c -- find all counts by artist
         from Shows
         where current_date between ShowStartDate and ShowEndDate
         group by ArtistId
        ) counts
      )
    )
  )

一些语法说明:

  • count(*) c表示该列(带有value count(*))被赋予了alias c,因此它可以被外部查询引用。您不能将其称为count(*),因为这将被解释为聚合尝试。
  • max(c)获取命名(或别名)列的最大值c(AFAIK,你不能编码max(count(*))- 也许你可以试试 - 我只是在没有控制台的情况下输入它来测试它)
  • counts别名,这是从结果集中进行选择时的语法要求

您尚未指定您正在使用哪个数据库,因此您可能必须current_date用您的数据库的等价物替换。

一些 dbs 允许您在查询中重用查询(使用with子句),这将避免重新运行 count 子查询。

此查询使用子选择,但您也可以使用连接来完成。

于 2013-09-09T14:59:49.080 回答
0

试试这个:

SELECT FirstName, FamilyName, Address
FROM Artists
WHERE ArtistId IN (
    SELECT ArtistId
    FROM (
        SELECT ArtistId, COUNT(ArtistId) AS Counted
        FROM Shows
        WHERE ShowEndDate IS null
        GROUP BY ArtistId) S1
    WHERE Counted = (
        SELECT MAX(Counted) 
        FROM (
            SELECT ArtistId, COUNT(ArtistId) AS Counted
            FROM Shows
            WHERE ShowEndDate IS null
            GROUP BY ArtistId) S2
        GROUP BY ArtistId)
    );

这很简单,应该适用于您的情况。

于 2013-09-09T14:28:29.980 回答