`
qdpurple
  • 浏览: 276690 次
  • 性别: 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问题,常见的mysql面试问题

    - 作用:确保列或列组合的值是唯一的。 - 特性:一个表可以有多个唯一约束,允许包含空值(`NULL`)。 - **区别**: - 主键是唯一约束的一种特殊情况,但同时具有不可为空的限制。 - 主键在创建时会自动建立索引,...

    MySql实现分组取n条最大记录.txt

    本篇文章详细介绍了如何使用MySQL实现分组取n条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...

    MySQL学习之旅(一)查询一个字段中相同属性的最大值

    在MySQL学习过程中,掌握如何查询一个字段中相同属性的最大值是一项基本且重要的技能。这个问题的背景是解决腾讯面试中的一道题目,目的是找出学生各科成绩中的最高分。本篇文章将介绍两种方法来实现这个目标。 ...

    MySQL数据库考试试题及答案-34页

    SUM 函数用于计算数据的总和,MAX 函数用于取得最大值,COUNT 函数用于计算数据的行数,AVG 函数用于计算数据的平均值。 2.游标声明 在 MySQL 中,DECLARE CURSOR 语句用于声明游标。游标用于在 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)的长度,加上一个记录字符串长度的字节...

    Oracle与Mysql自动增长列(id)的区别

    Oracle 和 MySQL 在处理自动增长列(通常用于主键ID)方面有着显著的差异。自动增长列主要用于确保每个新插入的行都有一个唯一的标识符。在MySQL中,这个过程相对直接,而在Oracle中则需要借助序列(sequence)来实现...

    joe_MySQL笔记

    - `Max()`: 获取最大值。 - `Min()`: 获取最小值。 - `Count()`: 计算记录数。 - 特别注意: 所有的分组函数都会忽略`NULL`值。 **流程控制函数**: - `If()`: 根据条件执行不同的操作。 - `Case` 表达式: 提供更复杂...

    精选常见mysql五十五道面试题目

    MyISAM表在数据文件中保存了自增主键的最大值,即使删除记录,重启后仍会从18开始。然而,InnoDB表只在内存中保存这个最大值,因此删除记录并重启后,新插入的记录ID将是15。 2. MySQL的技术特点包括:多线程支持、...

    怎么重置mysql的自增列AUTO_INCREMENT初时值

    对于MyISAM引擎,如果设置的值小于等于已使用过的最大值,自增列会自动设置为当前最大值加1;而InnoDB则不会改变初始值。 2. **通过`DROP`和`CREATE`重建表** 这种方法将完全删除原有表,然后创建一个结构相同的...

    MySQL面试题及答案.pdf

    在 MySQL 中,自增主键的行为取决于表类型。如果表类型是 MyISAM,那么自增主键的最大 ID 会记录到数据文件中,即使重启 MySQL 也不会丢失。但是,如果表类型是 InnoDB,那么自增主键的最大 ID 只记录到内存中,重启...

    Mysql获取id最大值、表的记录总数等相关问题的方法汇总

    这包括查询表的ID最大值、记录总数以及自增(Auto_increment)值。这些数据在网站开发、数据分析和系统维护中都有广泛的应用。以下是一些常用的方法: 1. **获取当前字段的最大ID值** 要获取一个表中某个字段...

    MariaDB vs Oracle MySQL 情史

    - **每表最大列数**: Oracle MySQL最多支持1000列,而MySQL支持的列数更多,最高可达4096列。 - **最大Blob/Clob大小**: Oracle MySQL的最大Blob/Clob大小为128TB,而MySQL的最大Blob/Clob大小为4GB。 - **最大CHAR...

    mysql数据库my.cnf配置文件

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

    (完整)MySQL数据库原理与应用期末考试复习资料.pdf

    3. **SQL函数**:SQL语言提供了各种内置函数,如`SUM`用于求和,`MAX`用于获取最大值。例如,问题中的第3题和第4题分别对应了这两个函数。 4. **通配符**:在SQL中,`%`是一个通配符,可以代表任意数量的字符,如第...

    mysql2005常用函数

    - `MAX()`:找到指定列的最大值。例如,找出工资最高的员工:`SELECT e_name FROM employee WHERE e_wage = (SELECT MAX(e_wage) FROM employee)`。 - `MIN()`:找出指定列的最小值。 - `SUM()`:计算一组数值的...

    mysql的日期和时间函数

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

    MySQL命令大全

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

Global site tag (gtag.js) - Google Analytics