【问题标题】:Struggling with SQL Joins MIN/MAX苦苦挣扎于 SQL 连接 MIN/MAX
【发布时间】:2018-07-20 14:02:28
【问题描述】:

我在使用 SQL 时真的很吃力,只是因为我来自基于 C 的语言,所以感觉非常陌生。

我有两个 SQL 表。一个称为“人”,并拥有IDNumber INT, FirstName VARCHAR, LastName VARCHAR 的字段。另一个称为“捐赠”,具有IDNumber INT and DollarsRaised INT 的字段。捐赠 IDNumber 字段使用外键关系链接到个人 IDNumber。

我正在尝试加入表格并使用 MIN/MAX 来显示筹集的资金最多和最少的成员,但我的教科书选择使用命令中有一些严重过剩的示例,所以我不能打破下语法。这是我得到的最接近的:

SELECT CONCAT(firstname, ' ', lastname) AS Name,
   MAX(DollarsRaised) AS 'Highest Earner'
FROM donations
   JOIN person USING(IDNumber);

执行此操作时,它每次都会从 person 表中的第一个条目中返回名称,而不是实际拉出所筹集到的美元价值最低的人。如果我使用 MIN 函数也是如此。我假设我需要一个 GROUP BY 语句或类似的东西,但不确定如何正确应用它。

【问题讨论】:

  • 你的问题说你有两个表名为 person 和donations,donationlist 是什么?
  • 打错了,donationlist是donations,我改名了
  • 我在 SQL Server 中工作,所以我不熟悉您在这里使用的 SQL 语法,但我会做一些事情,比如使用子查询来选择最大捐赠值,然后在 where 子句中使用它选择捐赠该金额的人。然后做同样的设计,但使用 MIN
  • 语法是MariaDB,我想我明白你在说什么,我会尝试再修改一下。
  • 捐赠表是每人一行,还是每人多行?

标签: sql join mysqli mariadb


【解决方案1】:
SELECT firstname + ' ' + lastname AS Name,
MAX(DollarsRaised) AS 'Highest Earner'
FROM donations  as d 
INNER JOIN persons as p on p.IDNumber = d.IDNumber
GROUP BY firstname + ' ' + lastname
ORDER BY MAX(DollarsRaised) DESC

【讨论】:

    【解决方案2】:

    我不确定这种关系是否为 1:M 并且您需要总数。这是一个要查看的查询:

    select *
    from
        person p inner join 
        (select IDNumber, sum(DollarsRaised) as TotalDollarsRaised from donations) d
            on d.IDNumber = p.IDNumber
    

    如果您真的只需要顶部,这里是旧的标准 SQL 方法。请注意,由于关系,它可以返回多行:

    select * from person p inner join donations d on d.IDNumber = p.IDNumber
    where DollarsRaised = (select max(DollarsRaised) from donations)
    

    将最小值和最大值放在一起的一种方法是使用联合:

    select * from person p inner join donations d on d.IDNumber = p.IDNumber
    where DollarsRaised = (select max(DollarsRaised) from donations)
    union
    select * from person p inner join donations d on d.IDNumber = p.IDNumber
    where DollarsRaised = (select min(DollarsRaised) from donations)
    order by DollarsRaised;
    

    假设实际上 min 和 max 并集(没有 all)将删除重复的行。

    您遇到的显示错误名称的问题是 MySQL 的一个奇怪之处,它允许您引用一个您不应该这样做的非聚合列。许多其他平台反而会给您一个错误。

    【讨论】:

    • “旧标准 SQL”方法通过我很容易掌握的语法为我提供了我需要的东西。这只是一个介绍类,我们通过命令行来做所有事情,这都是非常基础的。我今晚的最后一项任务是到期的,这让我很受挫,非常感谢。
    • 有没有办法在一个查询中将 MIN 和 MAX 拉到两个单独的行上?
    • @RadHatter 这就是union 查询将完成的任务。我相信这就是你所要求的。您可以使用union all 来涵盖最小值和最大值相等但仍需要单独行的情况。
    • 非常感谢。我觉得这门课落后了,但我想你给了我第一个可靠的例子,说明为什么我会使用 union vs join。非常感谢,我刚刚完成了作业所需的 3 个查询。
    【解决方案3】:

    我假设捐款表中每个人的捐款可能不止一次,这意味着您首先需要将每个人的捐款相加,然后显示金额最高的人。以下将适用于:

    SELECT p.IDNumber, p.FirstName, p.LastName,
    SUM(d.DollarsRaised) AS DollarsRaised
    FROM person p
    INNER JOIN donations d
    ON p.IDNumber = d.IDNumber
    GROUP BY p.IDNumber, p.FirstName, p.LastName
    ORDER BY DollarsRaised DESC
    LIMIT 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多