返回
前端
分类

2.对排序后的结果用uid进行分组

日期: 2020-01-02 08:10 浏览次数 : 196

Mysql 数据分组取某字段值所有最大的记录行,mysql字段

需求:

表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前。这是典型的排名表

+------+-------+--------------+---------------------+
| uid  | level | role         | time                |
+------+-------+--------------+---------------------+
| 7    |     1 | 摇滚圣魔     | 2014-06-12 15:01:05 |
| 1134 |     4 | 唯我独尊     | 2014-06-12 15:02:38 |
| 1134 |     4 | 唯我独尊     | 2014-06-12 15:02:39 |
| 7    |     3 | 摇滚圣魔     | 2014-06-12 15:02:59 |
| 5    |     3 | 韵儿铃♦      | 2014-06-12 15:04:09 |
| 7363 |     6 | 诗荷冰月     | 2014-06-12 15:04:23 |
| 6684 |     4 | つ道远虚空つ | 2014-06-12 15:05:13 |
| 7    |    16 | 摇滚圣魔     | 2014-06-12 15:05:46 |
| 1    |     2 | 斗土豪       | 2014-06-12 15:05:48 |
| 7    |    26 | 摇滚圣魔     | 2014-06-12 15:08:36 |
| 6684 |     8 | つ道远虚空つ | 2014-06-12 15:08:45 |
| 5    |    12 | 韵儿铃♦      | 2014-06-12 15:09:47 |
| 6834 |     1 | 无敌追翼     | 2014-06-12 15:10:56 |
| 5    |    16 | 韵儿铃♦      | 2014-06-12 15:11:18 |
| 8719 |     1 | 君望赤       | 2014-06-12 15:11:48 |
| 6274 |    36 | 五月独孤     | 2014-06-12 15:12:22 |
| 8724 |    26 | 童童         | 2014-06-12 15:12:31 |
| 1134 |    32 | 唯我独尊     | 2014-06-12 15:12:51 |
| 7    |    26 | 摇滚圣魔     | 2014-06-12 15:13:38 |
| 5    |    25 | 韵儿铃♦      | 2014-06-12 15:14:48 |
| 7757 |     3 | つ清灵旋つ   | 2014-06-12 15:16:50 |
| 7    |    26 | 摇滚圣魔     | 2014-06-12 15:17:26 |
| 5    |    28 | 韵儿铃♦      | 2014-06-12 15:18:08 |
| 7757 |    23 | つ清灵旋つ   | 2014-06-12 15:19:29 |
| 6274 |    43 | 五月独孤     | 2014-06-12 15:19:54 |
| 8724 |    30 | 童童         | 2014-06-12 15:20:39 |
| 7757 |    26 | つ清灵旋つ   | 2014-06-12 15:20:58 |
| 8707 |    36 | 就是干       | 2014-06-12 15:22:28 |
| 7757 |    29 | つ清灵旋つ   | 2014-06-12 15:23:05 |
| 7757 |    32 | つ清灵旋つ   | 2014-06-12 15:24:57 |
| 8726 |    10 | 连曦         | 2014-06-12 15:26:01 |
| 7363 |    34 | 诗荷冰月     | 2014-06-12 15:26:58 |
| 7    |    26 | 摇滚圣魔     | 2014-06-12 15:27:33 |
| 5    |    37 | 韵儿铃♦      | 2014-06-12 15:27:37 |
| 8347 |     1 | 无敌         | 2014-06-12 15:28:09 |
| 6274 |    47 | 五月独孤     | 2014-06-12 15:28:13 |
| 1    |    32 | 斗土豪       | 2014-06-12 15:29:18 |
| 1134 |    46 | 唯我独尊     | 2014-06-12 15:30:52 |
| 7757 |    41 | つ清灵旋つ   | 2014-06-12 15:30:56 |
| 9    |    34 | 饭饭饭饭の   | 2014-06-12 15:31:03 |
| 6274 |    48 | 五月独孤     | 2014-06-12 15:31:18 |
| 8724 |    41 | 童童         | 2014-06-12 15:32:30 |
| 7757 |    42 | つ清灵旋つ   | 2014-06-12 15:34:24 |
| 1134 |    48 | 唯我独尊     | 2014-06-12 15:34:56 |
| 1100 |     2 | 圣魔霄       | 2014-06-12 15:35:54 |
| 1008 |    21 | ∵嘟嘟冰儿∵ | 2014-06-12 15:36:10 |
| 7757 |    45 | つ清灵旋つ   | 2014-06-12 15:40:49 |
| 3088 |     4 | 战魂☼凌空    | 2014-06-12 15:41:38 |
| 5    |    41 | 韵儿铃♦      | 2014-06-12 15:41:56 |
| 7757 |    46 | つ清灵旋つ   | 2014-06-12 15:43:24 |

 

实现过程:

1.首先对该数据进行2次排序,uid 排序以及等级的降序排序

2.对排序后的结果用uid进行分组,分组后等级降序排序,时间升序排序

 

实现SQL:

 

select * from (select a.uid,a.level,a.role,a.time from 数据表 a 
where order BY a.uid desc,a.level desc) as 别名 group by user_uid order by level desc,time asc limit 30;

1、表结构//列信息2、表数据//行信息3、表索引//把列中的行加到索引中(一般情况下一个表一定要把id这一列的所有数据都加到主键索引中)

PHP代码中怎查询MYSQL数据库可以得到数据表中某个字段中最大的那条记录的ID号 举例说明:见问题补充

我是这样做的测试:
create table music(
id varchar(10),
title varchar(100),
name varchar(10)
);
insert into music values('2','离别','12354');
insert into music values('15','朋友','5454');
insert into music values('161','送别','4668');

<?php
$conn=mysql_connect("localhost:3307","数据库用户名","数据库密码");
mysql_select_db("date");
$result=mysql_query("select max(id+0) max_id from music",$conn);
$field=mysql_fetch_row($result);
print_r($field);
?>
结果:Array ( [0] => 161 )
因为mysql中varchar不能用max()所以通过id+0来转换id类型从而解决这个问题 ,如果你建表时id是整数型的就可以直接用max()了。详细解释见:hb.qq.com/a/20110624/000061.htm。必赢备用网址 ,  

2、[dos下]关闭mysql:net stop mysql
开启mysql:net start mysql
登陆mysql:mysql -uroot -p123 --tee=c:mysql.log
查看数据库命令:show database;
进入test数据库:use test
查看数据库表:show tables;
创建一个表:create table user(id int,name varchar(30),pass varchar(30));
查看表结构或表字段:desc user
查看表数据:select*from user;
查看表中的所有索引:show index from t2;
在表中插入数据:insert into user(id,name,pass) values(1,"hello","123");
查看表中的id:select*from user where id=1;
删除表中的id:delete from user where id=1;
修改表中的值:update user set name='hello' where id=1;
退出myaql:exit;
创建一个数据库:create database txet;
删除数据库:drop database;
修改表名:rename table user to user1;
删除表:drop table user1;

sql查询 分组后 每组某字段值最大的一行所有列

create table #a(address char(2),fenshu varchar(8))
insert into #a values ('a1','s1')
insert into #a values ('a1','s2')
insert into #a values ('a2','s3')
insert into #a values ('a1','s7')
insert into #a values ('a2','s4')
insert into #a values ('a2','s8')
insert into #a values ('a1','s8')
insert into #a values ('a2','s9')

实际语法测试 应该加上 分组条件区别,否则会有重复记录被取出(a.address = b.address)
select * from #a a
where fenshu in (
select max( fenshu) from #a b where a.address = b.address
group by address)  

数据分组取某字段值所有最大的记录行,mysql字段 需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(...

 

表字段的类型:
1、数值:int//int(3)与长度无关,不够3位时前面补0,默认不显示
float
2、字符串:char(n) 255字节 占用n个字节
varchar(n)最高65535字节 存多少占多少字节
text 65535字节
longtext 42亿字节
3、日期:date time datetime year

 

数据库的基础篇字段属性:
1、unsigned 无符号,全是正数
2、zenrofill 零填充,int(3),不够3位补0
3、auto_increment 自增
4、null 这一列值允许为null
5、not null 这一列值不允许为null
6、default 不允许为null给默认值

 

用s查看四种字符集:
1、server characterset: utf8 服务器字符集
2、Db characterset: utf8 数据库字符集
3、client characterset: utf8 客户端字符集
4、Conn. characterset: utf8 客户端连接字符集
查看数据库字符集命令:sohw create database text;
查看表字符集命令:show create table user;
PHP中设置mysql客户端和连接字符集:$sql="set names utf8";

 

表字段索引:
1、主键索引
2、普通索引
检查sql语句:desc select * from user where id=3G//加G把表颠倒一下
rows 1 表示找到一个id=3的人检索一行找到
查看表中的所有索引:show index from user;

 

后期维护普通索引:
1、添加普通索引:alter table t2 add index in_name(name);
2、删除普通索引:alter table t2 drop index in_name;

 

后期维护数据库字段:
1、添加字段
alter table t1 add age int;
2、修改字段
alter table t1 modify age int not null default 20;
3、删除字段
alter table t1 drop age;
4、修改字段名
alter table t1 change name username varchar(30);

 

结构化查询语言sql包含四个部分:
1、DDL //数据定义语言,reate,drop,alter
2、DML //数据操作语言,insert,update,delete
3、DQL //数据查询语言,select
4、DCL //数据控制语句,grant,commit,rollback

 

增-insert:insert into t1(username) values('g');
改-update:update t1 set username='f' where id=6;
一次更改多个值:update t1 set id=10, username='bb' where id =7;
删-delete:
delete from t1 where id=6;
delete from t1 where id in(1,2,5);
delete from t1 where id=1 or id=3 or id=5;
delete from t1 where id>=3 and id<=5;
delete from t1 where id between 3 and 5;
查-select:

1、选择特定的字段:select id,name from user where id=3;
2、给字段取别名-as:select pass as p,id from user where id=3;
select pass p,id from user where id=3;
3、取掉列中的重复值:select distinct name form user;
4、使用where条件进行查询:select * from user where id>=3 and id<=5;
5、查询空值null:select *from user where pass is null;
select *from user where pass is not null;
6、搜索like关键字:select * form user wher name like '%3%';
select * form user wher name like '%3%' or name like '%1%';
select * form user wher name regexp '.*3.*';
select * form user wher name regexp '(.*3.*)|(.*5.*)';
7、使用order by对查询结果排序:
升序 select * from user ordeer by id asc;注:升序可以不写asc
降序 select * from user ordeer by id desc;
8、使用limit限定输出个数:
select * from user order by id desc limit 0,3;
select * from user order by id desc limit 3;
9、concat函数-字符串连接符:select concat("a","-","c");
10、rand函数-随机排序:selec 8 from user order by rans() limit 3;
11、count统计:select count(*) from user;/ /
select count(id) from user;
select count(id) from user where name='user1';//统计user1出现的次数
12、sum求和:select sum(id) from user where name='user1';//符合要求的id 之和
13、avg平均数: select avg(id) from user;
14、max最大值: select max(id) from user;
15、min最小值: select min(id) from user;
16、分组聚合:select name,count(id) tot from mess group by name order by tot desc;//tot是起了个别名//group by必须写在order by的前面
select name,count(id) tot from mess group by name having tot>=5;//group by必须写在having的前面//分组后加条件必须用having,而非where
17、在id字段后加uid字段:alter table post add uid int after id;
18、多表查询:
(1)普通查询-多表
(2)嵌套查询-多表
(3)左连接查询-多表
普通查询:
select user.name,count(post.id) from user,post where user.id=post.uid group by post.uid;
左连接查询:
select user.name,post.title,post.content from user left join post on user.id=post.uid;//显示全部用户发送或者没有发送的名字加内容
普通查询:
//得到发帖子的人-普通查询mysql> select distinct user.name from user,post where user.id=post.uid;
嵌套查询:
//得到发帖子的人-嵌套查询mysql> select name from user where id in(select uid from post);

PHP操作数据库:

1、通过PHP连接上mysql数据库
2、选择数据库
3、通过PHP进行insert操作
4、通过PHP进行delete操作
5、通过PHP进行update操作
6、通过PHP进行select操作
通过PHP连接mysql数据库:mysql_connect("localhost","root","123");
选择数据库:mysql_select_db("test");
设置客户端和连接字符集:mysql_query("set names utf8");
通过PHP进行insert操作://从表单接收数据$uername="user1"; $passwoed="123";
//$sql="insert into t1(username,password) values('$username','$password')";
//执行这条mysql语句 var_dump(mysql_query($sql));
//释放连接资源 mysql_close($conn);
//通过PHP进行update操作$sql="update t1 set username='user2',pssword='111' where id=8";
//通过PHP进行delete操作:$sql="delete form t1 where id=8";
从结果集中取数据:
mysql_fetch_assoc//关联数组
mysql_fetch_row//索引数组
mysql_fetch_array//混合数组
mysql_fetch_object//对象
//通过PHP进行select操作$sql="select form t1";
从结果集中取全部数据:while($row=mysql_fech_assoc($result)){echo "

"; print_r($row) echo "

";}
mysql_insert_id//取得上一步INSERT操作产生的ID
mysql_num_fields//得到insert,update,delete操作影响的行数musql_num_rows//得到select操作影响的行数
//得到表总行数:$sql="select count(*) form t1";
$rst=mysql_query($sql);
$tot=mysql_fetch_row($rst);