如何用MYSQL语句分组 Mysql 分组并排序
如何用MYSQL语句分组
用 UNION 联合查询
(select * from 表名 where 字段名 = 1 limit 5 )
union
(select * from 表名 where 字段名 = 2 limit 5 )
Mysql 分组并排序
1、按rowno分组后,每个rowno只有一条数据。所以排序不可能同时按rowno, count来排序。
2、感觉你应该只按count排序
------------------
SELECT rowno
,COUNT(*) AS Num
FROM TableGROUP BY rowno
ORDER BY COUNT(*)
mysql分组查询。
错误方法:
select * from A where age=(select max(age) from A where sex="男")
or age=(select max(age) from A where sex="女")
解释:先用两个子查询分别把男女生中年龄最大的数字筛选出来,然后在整个表中寻找对应年龄的男生与女生。但是这样的话,男女生中年龄不是最大的也可能被选出来
因此,要分别查出来最高年龄的男生与女生,再用union结合到一个视图下。
由于不能用union方式,所以解决方法如下:
select * from A where (age,sex) in (select age,sex from A where 序列号="1" or 序列号="11" group by sex order by age desc)
解释:先把表中的男女分组,组内按年龄的降序排列。因为很清楚男生女生的具体数量,那么就能在第一行和第十一行找到代表年龄最大的两个age数和对应的性别。然后,在整个表中进行一个条件查询。
其实写到这里,我觉得如果不能用(age,sex)双列条件判断,那么只能用union了
mysql 按字段的一部分分组
CREATE TABLE test_guankairi (
id INT,
image VARCHAR(30)
)
INSERT INTO test_guankairi
SELECT 1, :/image/a/1/tupian.jpg UNION ALL
SELECT 2, :/image/a/2/tupian.jpg UNION ALL
SELECT 3, :/image/a/3/tupian.jpg UNION ALL
SELECT 4, :/image/a/4/tupian.jpg UNION ALL
SELECT 5, :/image/a/1/tupian5.jpg
SELECT
-- REVERSE 是字符反转
-- 因为 MySQL 的 INSTR, 只能从前向后查找。
-- 而这里需要 从后向前找第一个 /
-- 因此先做字符反转。
-- INSTR 用于找第一个 / 的位置.
-- RIGHT 用于获取字符右边的字符
RIGHT(image, INSTR( REVERSE(image), /) ) AS img,
COUNT(*)
FROM
test_guankairi
GROUP BY
RIGHT(image, INSTR( REVERSE(image), /) )
-------------- ----------
| img | COUNT(*) |
-------------- ----------
| /tupian.jpg | 4 |
| /tupian5.jpg | 1 |
-------------- ----------
2 rows in set (0.00 sec)
MySQL 怎样分组查询
mysql
与
oracle
中分组、聚合函数的区别!
今天需要这样一句
sql
:先用
group by
进行分组,然后利用聚合函数
count
或者
sum
进行计算,并显示
其它的辅助信息。
在
mysql
环境中,我模拟如下环境:
CREATE TABLE `room` (
`rid` varchar(5) default NULL,
`rname` varchar(5) default NULL,
`pid` int(11) default NULL,
`seq` int(11) NOT NULL auto_increment,
PRIMARY KEY
(`seq`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8
房间表,
seq
房间入住序号
(主键)
,
rname
为房间名,这里不考虑第三范式
情景:人住房间,
统计某个房间某个人住的次数
用户表,客人的信息
CREATE TABLE `user1` (
`ID` int(11) NOT NULL auto_increment,
`USERNAME` varchar(50) default ,
`PASSWORD` varchar(50) default ,
PRIMARY KEY
(`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
Mysql
中语句如下:
select count(u.username)
,
r.rname
,r.rid,r.pid
from room r,user1 u
where r.pid=u.id
group by r.rid,r.pid
这里
r.rname
并没有出现在
group by
子句、聚合函数中,但是
MYSQL
中仍然能够执行、列
出数据。
但是,在
ORACLE
中,却不能!
!
!
!
Oracle
环境中:
/*
--
显示:
Ora-00979 not a ORDER BY expression
--
因为:
order by
后边的
c.channel_code
不在
ORDER BY
子句中
select count(c.channel_name),m.media_name
from channel c,media m
where c.media_code = m.media_code
group by c.media_code,m.media_name
order by
c.channel_code
--
显示:
Ora-00979 not a GROUP BY expression
--
因为:
group by
或者聚合函数中没有包含
c.channel_name
select count(c.channel_name),m.media_name,
c.channel_name
from channel c,media m
mySQL分组排序
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。
1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)
求SQL关于分组的语句写法
唯一记录:select uid,in_date from person group by uid,in_date having count(*)=
重复纪录:select uid,in_date,count(*) from person group by uid,in_date having count(*)>1