求分组最大的sql语句

今天遇到一个问题,有一张数据库表格:

salary
uid,sal,time,state
------------------
1,1100,2012-1-1,1
1,1200,2012-2-1,1
1,1300,2012-3-1,1
2,2100,2012-1-1,1
2,2200,2012-2-1,1
3,3100,2012-1-1,1
4,4100,2012-1-1,1
4,4200,2012-2-1,1

希望得到这样一个查询:每一个成员的最后一次工资记录。即,希望得到的是:

1,1300,2012-3-1,1
2,2200,2012-2-1,1
3,3100,2012-1-1,1
4,4200,2012-2-1,1

这个实在不好弄,开始想max和groupby,不过无法取得出了max里面和groupby里面的其他字段。



然后百度找到了一个解决方法,挺有意思的:

select * from salary s1 where not exists (select * from salary where uid = s1.uid and time > s1.time)

大概解释是:找到time最大的,在uid相等的情况下,之后最大的那一条记录没办法满足time > s1.time(没有比它更大的)。

不过这这解决了“最大”这个问题,如果扩展一下,要取最大N个怎么办?

mysql在linux系统下的备份脚本

转自:http://os.chinaunix.net/a2006/0823/970/000000970876.shtml
空了修改修改就能备份整个站点了

脚本如下:

  1.     #!/bin/sh
  2.     # mysql_backup.sh: backup mysql databases and keep newest 5 days backup.
  3.     #
  4.     # Last updated: 20 March 2006
  5.     # ———————————————————————-
  6.     # This is a free shell script under GNU GPL version 2.0 or above
  7.     # Copyright (C) 2006 Sam Tang
  8.     # Feedback/comment/suggestions : http://www.real-blog.com/
  9.     # ———————————————————————-
  10.     # your mysql login information
  11.     # db_user is mysql username
  12.     # db_passwd is mysql password
  13.     # db_host is mysql host
  14.     # —————————–
  15.     db_user=“root”
  16.     db_passwd=“”
  17.     db_host=“localhost”
  18.     # the directory for story your backup file.
  19.     backup_dir=“”
  20.     # date format for backup file (dd-mm-yyyy)
  21.     time=“$(date +”%d-%m-%Y“)”
  22.     # mysql, mysqldump and some other bin’s path
  23.     MYSQL=“$(which mysql)”
  24.     MYSQLDUMP=“$(which mysqldump)”
  25.     MKDIR=“$(which mkdir)”
  26.     RM=“$(which rm)”
  27.     MV=“$(which mv)”
  28.     GZIP=“$(which gzip)”
  29.     # check the directory for store backup is writeable
  30.     test ! w $backup_dir >> echo “Error: $backup_dir is un-writeable.” >> exit 0
  31.     # the directory for story the newest backup
  32.     test ! “$backup_dir/backup.0/” >> $MKDIR “$backup_dir/backup.0/”
  33.     # get all databases
  34.     all_db=“$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse ‘show databases’)”
  35.     for db in $all_db
  36.     do
  37.      $MYSQLDUMP u $db_user h $db_host p$db_passwd $db | $GZIP 9 > “$backup_dir/backup.0/$time.$db.gz”
  38.     done
  39.     # delete the oldest backup
  40.     test “$backup_dir/backup.5/” >> $RM rf “$backup_dir/backup.5”
  41.     # rotate backup directory
  42.     for int in 4 3 2 1 0
  43.     do
  44.      if(test “$backup_dir”/backup.“$int”)
  45.      then
  46.      next_int=`expr $int + 1`
  47.      $MV “$backup_dir”/backup.“$int” “$backup_dir”/backup.“$next_int”
  48.      fi
  49.     done