在 MySQL 数据表中获取 MAX(列) 所在行的其他数据字段的值

global_biz2 2016-08-15 02:22:03
Hi,

下面是一个 MySQL 测试的表,
主要目的是通过一条 sql 得到 max(cordernumber) 所在行对应的 cvalue1
以及得到 min(cordernumber) 所在行对应的 cvalue1



create table c_test
(
cid integer primary key auto_increment,
cvalue1 integer,
cordernumber integer,
cname varchar(30)
);


这是样本数据:


insert into c_test (cvalue1, cordernumber, cname) values (111, 222, 'hi');
insert into c_test (cvalue1, cordernumber, cname) values (222, 111, 'hi');
insert into c_test (cvalue1, cordernumber, cname) values (333, 333, 'hi');
insert into c_test (cvalue1, cordernumber, cname) values (555, 666, 'hi');
insert into c_test (cvalue1, cordernumber, cname) values (666, 555, 'hi');


下面是查询的 sql:


select cname, cvalue1,
max(cordernumber), min(cordernumber) from c_test
group by cname


下面是输出结果:


cname,cvalue1,max(cordernumber),min(cordernumber)
----- ------- ----------------- -----------------
hi, 111, 666, 111



下面是最终需要的查询sql:

select cname, cvalue1,
(这列如何写能得到 cvalue1 = 555) (即 max(cordernumber) 所在行对应的 cvalue1 的值) ,
(这列如何写能得到 cvalue1 = 222) (即 min(cordernumber) 所在行对应的 cvalue1 的值) ,

max(cordernumber), min(cordernumber) from c_test
group by cname

请帮下忙,谢谢。
...全文
6067 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
global_biz 2016-09-10
  • 打赏
  • 举报
回复
结贴送分了
global_biz2 2016-08-15
  • 打赏
  • 举报
回复
实际上,相当于下面的功能: 假设有这样一个聚合 function,它可以传入两列: Function TestFunction (MaxColumnName, OtherColumnName) ( 这里面 对 MaxColumnName 进行比较,记录最大的一个 MaxColumnName 的值,当最大值发生变化时,把 OtherColumnName 的值也在最大值变化时一起保存, 这样,得出来的结果就是,它可以知道最大值是在第几行,然后,把那一行的 OtherColumnName 的值也跟最大值一起关联起来。 最后, return 的时候,就返回这个 OtherColumnName 的值,而不是返回 MaxColumnName 的最大值。 ) 那么,在 SQL 里面,如何有上面的自定义 function 的话,应该就这样写,

select cname, cvalue1, 
max(cordernumber), min(cordernumber) , 
MAXTestFunction(cordernumber,  cvalue1) as 'What I Want A',
MINTestFunction(cordernumber,  cvalue1) as 'What I Want B',
sum (column1), sum(column2), count(column3), .....
from c_test
group by cname
不知 MySQL 是不是有类似的方法可以实现这个??
global_biz2 2016-08-15
  • 打赏
  • 举报
回复
实际上想要的是: 我对一个数据表通过 Group By 进行相关数值字段的求和与求总数,然后,再这个基础上,再加上两列用来得到所有这些聚合数据的一个最小值与最大值(就是例子中的 cordernumber) ,这个最小值与最大值是表示:在这一批聚合数据中是第一条记录或最后一条记录。 现在通过 max , min 可以得到这个 cordernumber 的最小与最大值了,但是,现在想在同一条查询 SQL 中,将与它相关联的其他列的一些字段也下起查出来。

select cname, cvalue1, 
max(cordernumber), min(cordernumber) ,
(XXXXXXX) as '列A,该列的 cordernumber = max(cordernumber)',
(YYYYYYY) as '列B,该列的 cordernumber = min(cordernumber)'
sum (column1), sum(column2), count(column3),,,, sum(column30)
from c_test
where 1=1 && 2=2 && (有很多其他条件在这里)
group by cname
ACMAIN_CHM 2016-08-15
  • 打赏
  • 举报
回复
select *
from (select * from c_test order by cordernumber desc limit 1) a,(select * from c_test order by cordernumber asc limit 1)
soton_dolphin 2016-08-15
  • 打赏
  • 举报
回复
引用 2 楼 global_biz2 的回复:
[quote=引用 1 楼 soton_dolphin 的回复:]

select cvalue, corderNumber
from c_test
where corderNumber = (select max(corderNumber) from c_test)
union
select cvalue.corderNumber
from c_test
where orderNumber = (select min(corderNumber) from c_test) 
在实际上使用的 SQL 中,除了在 SQL 中用到那两个 Max, 与 Min 外,还有很多列是 Sum 与 Count 其他字段的,所以,不能通过拆成 Union 再合并,这样只能处理 Max 与 Min 对应的,达不到最终想要的结果。 实际上的表是还有很多列,如下面的 column1, column2, column3,...等,请再帮下忙。

select cname, cvalue1, 
max(cordernumber), min(cordernumber) , sum (column1), sum(column2), count(column3), .....

from c_test
group by cname
[/quote] 不明白你想要什么
global_biz2 2016-08-15
  • 打赏
  • 举报
回复
引用 1 楼 soton_dolphin 的回复:

select cvalue, corderNumber
from c_test
where corderNumber = (select max(corderNumber) from c_test)
union
select cvalue.corderNumber
from c_test
where orderNumber = (select min(corderNumber) from c_test) 
在实际上使用的 SQL 中,除了在 SQL 中用到那两个 Max, 与 Min 外,还有很多列是 Sum 与 Count 其他字段的,所以,不能通过拆成 Union 再合并,这样只能处理 Max 与 Min 对应的,达不到最终想要的结果。 实际上的表是还有很多列,如下面的 column1, column2, column3,...等,请再帮下忙。

select cname, cvalue1, 
max(cordernumber), min(cordernumber) , sum (column1), sum(column2), count(column3), .....

from c_test
group by cname
soton_dolphin 2016-08-15
  • 打赏
  • 举报
回复

select cvalue, corderNumber
from c_test
where corderNumber = (select max(corderNumber) from c_test)
union
select cvalue.corderNumber
from c_test
where orderNumber = (select min(corderNumber) from c_test) 

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧