`
qdpurple
  • 浏览: 272661 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql 取最大值列的问题

阅读更多

需求: 查询/更新某列(id) 最大值的行.

尝试1: 

select * from table where id =max(select max(id) from table); --可以通过

update table set name='new name' where  id =max(select max(id) from table); --不能可以通过

不能通过原因 ,求解释?

 

尝试2: 通过用户变量:(可行)

select    @maxid  :=max(id) from hchkpage;

update hchkpage set payeename  = 'new name' where id =@maxid;

此方法可行, 局限在数据库客户端, 在程序中不能使用.

 

通过参考mysql官方文档:

http://dev.mysql.com/doc/refman/5.1/zh/index.html

http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#update

想到此方法:

update hchkpage set payeename='good' order by id desc limit 1;

:通过条件排序和使用limit限制查询条数可取得最大行 ,执行更新.

 

总结: 遇到问题参考官方文档.

 

 

1
0
分享到:
评论
13 楼 jinnianshilongnian 2012-10-19  
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗

你用的是哪个版本 看了下5.5支持  我用的是5.3

5.5.23

哦 我说呢,看了下最新文档 支持这种多表更新 看了下oracle10g的文档也是不支持 


我以前用的是5.1,这么用也是没问题的。刚刚在官网下了个安装包,测试也是没问题的
[img]
mysql>
mysql> show create table test.tt\G;
*************************** 1. row ***************************
       Table: tt
Create Table: CREATE TABLE `tt` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(12) NOT NULL DEFAULT '',
  `age` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

ERROR:
No query specified

mysql> select version();
+------------------+
| version()        |
+------------------+
| 5.1.30-community |
+------------------+
1 row in set (0.00 sec)

mysql> select * from test.tt;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | newname |    4 |
|  2 | 11addfa |   22 |
|  3 | 2dfe    | 4444 |
|  4 | newname |    4 |
+----+---------+------+
4 rows in set (0.00 sec)

mysql> UPDATE test.tt,(SELECT MAX(id) AS id FROM test.tt) AS t2 SET tt.age=age*2
WHERE tt.id=t2.id;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test.tt;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | newname |    4 |
|  2 | 11addfa |   22 |
|  3 | 2dfe    | 4444 |
|  4 | newname |    8 |
+----+---------+------+
4 rows in set (0.00 sec)

mysql>
[/img]

哦  我使用的版本
5.4.3-beta-community 
我看官方给的文档也是可以的
12 楼 babaoqi 2012-10-19  
jinnianshilongnian 写道
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗

你用的是哪个版本 看了下5.5支持  我用的是5.3

5.5.23

哦 我说呢,看了下最新文档 支持这种多表更新 看了下oracle10g的文档也是不支持 


我以前用的是5.1,这么用也是没问题的。刚刚在官网下了个安装包,测试也是没问题的
[img]
mysql>
mysql> show create table test.tt\G;
*************************** 1. row ***************************
       Table: tt
Create Table: CREATE TABLE `tt` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(12) NOT NULL DEFAULT '',
  `age` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

ERROR:
No query specified

mysql> select version();
+------------------+
| version()        |
+------------------+
| 5.1.30-community |
+------------------+
1 row in set (0.00 sec)

mysql> select * from test.tt;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | newname |    4 |
|  2 | 11addfa |   22 |
|  3 | 2dfe    | 4444 |
|  4 | newname |    4 |
+----+---------+------+
4 rows in set (0.00 sec)

mysql> UPDATE test.tt,(SELECT MAX(id) AS id FROM test.tt) AS t2 SET tt.age=age*2
WHERE tt.id=t2.id;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test.tt;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | newname |    4 |
|  2 | 11addfa |   22 |
|  3 | 2dfe    | 4444 |
|  4 | newname |    8 |
+----+---------+------+
4 rows in set (0.00 sec)

mysql>
[/img]
11 楼 babaoqi 2012-10-19  
学习了 
10 楼 jinnianshilongnian 2012-10-19  
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗

你用的是哪个版本 看了下5.5支持  我用的是5.3

5.5.23

哦 我说呢,看了下最新文档 支持这种多表更新 看了下oracle10g的文档也是不支持 
9 楼 babaoqi 2012-10-19  
jinnianshilongnian 写道
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗

你用的是哪个版本 看了下5.5支持  我用的是5.3

5.5.23
8 楼 jinnianshilongnian 2012-10-19  
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗

你用的是哪个版本 看了下5.5支持  我用的是5.3
7 楼 jinnianshilongnian 2012-10-19  
babaoqi 写道
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗

你是用的么数据库? mysql/oracle好像都不支持这种语法吧
6 楼 babaoqi 2012-10-19  
jinnianshilongnian 写道
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?


一直这么用,你执行的时候报错了么?能把错误信息帖下吗
5 楼 jinnianshilongnian 2012-10-19  
babaoqi 写道
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id

你试过吗?
4 楼 babaoqi 2012-10-19  
update table,(select max(id) as id from table) as ttab
set table.name='new name'
where  table.id =ttab.id
3 楼 wgh596 2012-10-18  
你的尝试2,用程序实现是一样的。
2 楼 jinnianshilongnian 2012-10-17  
挺不错的。

update table set name='new name' where  id =max(select max(id) from table);
这是mysql的限制,子查询用的表不能是update的表
1 楼 laogao3232 2012-10-17  
这个需求有点儿意思。

相关推荐

    insert和select结合实现”插入某字段在数据库中的最大值+1″的方法

    本文是mysql 数据库 问题一 将表一的数据导入表二...在表中插入数据时,某一字段取数据库中该字段的最大值,并+1,这个问题很多人都说用存储过程什么的解决,其实使用insert 和 select 结合就可以很好的解决这个问题啊

    MySql函数-取一个字符串分隔后指定位置的子字符串

    一、函数功能:对字符串进行分隔数组,取指定顺序位置的子字符串,支持左右双向获取,支持默认值返回,附有测试用例 二、函数格式:fn_get_split_val(in_str varchar,in_delimiter varchar,in_order int,in_default ...

    django 获取字段最大值,最新的记录操作

    如果是直接在数据库拉取 from django.db.models import Max Argument.objects.all().aggregate(Max(‘rating’)) 如果是从已经存在的model列表获取 from django.db.models import Max args = Argument.objects....

    MYSQL安装包官方试用版

    每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节...

    mysql的日期和时间函数

    如果你增加 MONTH、YEAR_MONTH 或 YEAR,并且结果日期的天比新月份的最大天数还大,那么它将被调整到新月份的最大天数: mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> 1998-02-28 注意,上面的例子...

    mysql数据库my.cnf配置文件

    # 你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。 max_connections = 500 # MySQL的最大连接数,如果服务器的并发...

    MYSQL常用命令大全

    MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列 4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 5.BLOB TEXT类型,最大长度为65535(2^16-1)个字符...

    MySQL命令大全

    MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列 4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 5.BLOB TEXT类型,最大长度为(2^16-1)个字符。 6...

    mysql数据库的基本操作语法

    auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。 4、 foreign key 约束 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照...

    mysql 列转行,合并字段的方法(必看)

    max—聚合函数 取最大值 (case course when ‘语文’ then score else 0 end) —判断 as 语文—别名作为列名 SELECT `name`, MAX( CASE WHEN course='\u8bed\u6587' THEN score END ) AS 语文, MAX( CASE...

    MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配记录。LEFT JOIN 基本语法如下: ... FROM table1 LEFT JOIN table2 ON condition ... MySQL LEFT JOIN 用法实例 下面是两...

    mysql基础只是总结

    float[(M,D)] 10的(M-D)次方->代表最大值 D->代表保留位数不够补0 //For float(M,D), double(M,D) or decimal(M,D), M must be >= D //只写M 0-24代表float精确度总的十位数超过6位用科学计数法,小数超出四舍五...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    (1)max:求最大值 求每个部门的最高工资: [sql] view plain copy select EMP_NAME,EMP_DEP,max(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (2)min:求最小值 求每个部门的最仰工资: [sql] view plain ...

    MYSQL,SQLSERVER,ORACLE常用的函数

    取子字符串,从start开始,取count个 SQL> select substr('13088888888',3,8) from dual; SUBSTR(' -------- 08888888 12.REPLACE('string','s1','s2') string 希望被替换的字符或变量 s1 被替换的字符串 s2...

    fieldtop:查找MySQL数据库中的近溢列

    取决于项目运行了多长时间,这可能没有问题,或者可能意味着您的领域在某个时候有溢出的危险。 一些用户名已经使用了最大长度。 如果您的数据库设计与您的应用程序同步,这可能是可以的。 用户业力列中的负值已经...

    2009达内SQL学习笔记

    ORDER BY 子句取一个或多个列的名字。 对空值,按无穷大处理(升序中,空值排最后;降序中排最前)。 1、用法:Select prod_id,prod_price,prod_name From Products Order By prod_price,prod_name; (从左到右...

    程序员的SQL金典6-8

     8.1.2 列值子查询  8.2 SELECT列表中的标量子查询  8.3 WHERE子句中的标量子查询  8.4 集合运算符与子查询  8.4.1 IN运算符  8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他...

    程序员的SQL金典7-8

     8.1.2 列值子查询  8.2 SELECT列表中的标量子查询  8.3 WHERE子句中的标量子查询  8.4 集合运算符与子查询  8.4.1 IN运算符  8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他...

    程序员的SQL金典4-8

     8.1.2 列值子查询  8.2 SELECT列表中的标量子查询  8.3 WHERE子句中的标量子查询  8.4 集合运算符与子查询  8.4.1 IN运算符  8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他...

Global site tag (gtag.js) - Google Analytics