SQL选择从行计算最大值时具有最大值的行
如果我想为特定列选择具有最大值的行,我可以简单地这样做SQL选择从行计算最大值时具有最大值的行,sql,mysql5,Sql,Mysql5,如果我想为特定列选择具有最大值的行,我可以简单地这样做 SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename) 我的问题有两方面。首先,如果该值不是一列,而是对该行进行操作的存储过程的结果,那么语法是什么?差不多 SELECT * FROM tablename WHERE CALL procname (???) = (SELECT MAX (CALL procname (???) F
SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename)
我的问题有两方面。首先,如果该值不是一列,而是对该行进行操作的存储过程的结果,那么语法是什么?差不多
SELECT * FROM tablename
WHERE CALL procname (???)
= (SELECT MAX (CALL procname (???) FROM tablename)
SELECT
@proc:=CALL procname(colname) AS dummy1,
IF(@proc>@val,@id:=pkcol,@id) AS dummy2,
IF(@proc>@val,@val:=@val,@val) AS dummy3
FROM
(@id:=0) AS initid,
(@val:=0) AS initval,
tablename
;
-- discard query result
SELECT * FROM tablename WHERE pkcol=@id;
我如何充实这个问题
其次,在这种简单的形式中,我们在每一行上调用一次procname
,以确定MAX(…)
,然后可能在每一行上再次调用,以测试每一行是否具有最大值
我如何优化这一点?我猜它可能和临时桌子有关,但我不知道引擎有多聪明,我在心里把它与一次只需维护一行值的C风格for循环的性能进行比较。假设您在
pkcol
中有一个数字主循环,并且您的计算列colname
也是数字的,您可以尝试类似的方法
SELECT * FROM tablename
WHERE CALL procname (???)
= (SELECT MAX (CALL procname (???) FROM tablename)
SELECT
@proc:=CALL procname(colname) AS dummy1,
IF(@proc>@val,@id:=pkcol,@id) AS dummy2,
IF(@proc>@val,@val:=@val,@val) AS dummy3
FROM
(@id:=0) AS initid,
(@val:=0) AS initval,
tablename
;
-- discard query result
SELECT * FROM tablename WHERE pkcol=@id;
这将非常接近你的C结构。你能给我一个链接来解释
@
和:=
语法吗?我不确定我是否理解这一点。。。它正在修改表吗?@xxx
是一个会话变量-将它与PHP中的$xxx进行比较。:=
是赋值运算符(就像在Pascal中一样)。看见