在SQL中挣扎加入MIN / MAX

时间:2018-02-09 18:23:57

标签: sql join mysqli mariadb

我真的很挣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);

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

3 个答案:

答案 0 :(得分:0)

我不确定这种关系是否为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)

将min和max结合在一起的方法是使用union:

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;

假设联盟(没有all)实际上存在最小和最大关系将删除重复的行。

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

答案 1 :(得分:0)

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 :(得分:0)

我认为捐款表中每人可以捐赠多个,这意味着您首先需要为每个人捐款,然后向最高金额的人显示。以下内容适用于此:

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
相关问题