Mysql查询问题?

时间:2010-03-31 12:54:31

标签: mysql

ID NAME AMT 
1 Name1 1000 
2 Name2 500
3 Name3 3000
4 Name1 5000
5 Name2 2000
6 Name1 3000

将上表视为样本。

我的SQL查询出现问题,我是这样使用的。

Select name,amt from sample where amt between 1000 and 5000

它返回表格中1000到5000之间的所有值,而不是我希望获得每个名称的最大金额记录

即,

3 name3 3000
4 name1 5000
5 name2 2000

4 个答案:

答案 0 :(得分:1)

select name, max(amt) from sample group by name

但是,你可能会遇到问题,因为可能不止一个。

答案 1 :(得分:1)

你应该按名称分组:

SELECT `name`,MAX(amt) from sample GROUP BY `name` where amt between 1000 and 5000

答案 2 :(得分:0)

select id, name, amt from sample where amt = (select max(amt) from sample)

应返回样本表中具有max amt的所有记录

编辑:

select id, name, amt 
from sample 
where amt = (
  select max(amt) 
  from sample 
  where amt between 1000 and 5000)

此查询将返回金额等于1000到5000之间的最大金额的所有记录

答案 3 :(得分:0)

如果你只需要一个包含MAX(amt)的id,那么这就可以了:

SELECT id, name, MAX(amt)
FROM sample
WHERE amt BETWEEN 1000 AND 5000
GROUP BY name;

如果您需要所有ID,那么它会变得更复杂。需要两个查询,以及一个临时表:

CREATE TEMPORARY TABLE maxamts
    SELECT name AS maxname, MAX(amt) AS maxamt
    FROM sample
    WHERE amt BETWEEN 1000 AND 5000
    GROUP BY maxname;

SELECT GROUP_CONCAT(id), maxname AS name, maxamt AS amt
FROM maxamts
LEFT JOIN sample ON ((maxname = sample.name) AND (maxamt = amt))
GROUP BY maxname;

简而言之:从查询中创建一个临时表,找到每个名称/ max(amt)对,然后使用该临时表连接回原始表并提取与名称/数量组合匹配的ID。

请记住,group_concat默认限制为1,024个字符,(show variables like '%group_concat%'以查看服务器上的最大长度),因此如果您有一个大型数据集,请增加该限制,或删除group_concat和从第二个查询分组并解析应用程序中的信息。