http://topic.csdn.net/u/20091130/09/beddab7c-3f91-4e4d-80d1-f3f4933e149b.html
第14楼
mysql> select *
-> from t_igyhi a
-> where 3>(select count(*) from t_igyhi where `type`=a.type and p<a.p)
-> order by `type`,p;实际使用的时候,我改了下,把 where 3>...改成 where 6>... 把 and p<a.p 改成 p>a.p
这样我想取的数据是按组从p的最大排到最小,取出前6个,比如
p: 1,5,3,8,5,7,3,4,1 取出的就是按顺序的8,7,5,5,4,3(至于哪个3,不太清楚)出现了一个这样的问题有很多条数据(>=10条),当 where 2>...时候 能正常取2条.
当 where 3>...时候 能正常取3条.
当 where 4>...时候 能正常取4条.
当 where 5>...时候 突然就取了10条出来
当 where 6>...时候 也是10条.这是什么问题?
还有上次没注意到的另一个问题
ACMAIN说 "不是因为输出根本就没有控制排序,改成如下 "
那为什么在没有控制排序的情况下A,B组是有排序效果的,C组就没有
第14楼
mysql> select *
-> from t_igyhi a
-> where 3>(select count(*) from t_igyhi where `type`=a.type and p<a.p)
-> order by `type`,p;实际使用的时候,我改了下,把 where 3>...改成 where 6>... 把 and p<a.p 改成 p>a.p
这样我想取的数据是按组从p的最大排到最小,取出前6个,比如
p: 1,5,3,8,5,7,3,4,1 取出的就是按顺序的8,7,5,5,4,3(至于哪个3,不太清楚)出现了一个这样的问题有很多条数据(>=10条),当 where 2>...时候 能正常取2条.
当 where 3>...时候 能正常取3条.
当 where 4>...时候 能正常取4条.
当 where 5>...时候 突然就取了10条出来
当 where 6>...时候 也是10条.这是什么问题?
还有上次没注意到的另一个问题
ACMAIN说 "不是因为输出根本就没有控制排序,改成如下 "
那为什么在没有控制排序的情况下A,B组是有排序效果的,C组就没有
-- 表的结构 `ttt`
--CREATE TABLE IF NOT EXISTS `ttt` (
`ylid` int(11) NOT NULL auto_increment,
`ylfl` varchar(20) default NULL,
`ylmc` varchar(20) default NULL,
`yllj` varchar(200) default NULL,
`yldj` varchar(2) default NULL,
PRIMARY KEY (`ylid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=28 ;--
-- 导出表中的数据 `ttt`
--INSERT INTO `ttt` (`ylid`, `ylfl`, `ylmc`, `yllj`, `yldj`) VALUES
(1, '花草', '竹子', 'http://www.163.cn', '2'),
(2, '书籍', '西游记', 'http://www.163.cn', '4'),
(7, '水果', '香蕉', 'http://www.163.cn', '2'),
(8, '水果', '苹果', 'http://www.163.cn', '6'),
(9, '水果', '西瓜', 'http://www.163.cn', '4'),
(10, '汽车', '本田', 'http://www.163.cn', '4'),
(13, '水果', '釉子', 'http://www.163.cn', '2'),
(14, '水果', '鸭梨', 'http://www.163.cn', '2'),
(15, '水果', '芒果', 'http://www.163.cn', '2'),
(16, '水果', '葡萄', 'http://www.163.cn', '4'),
(17, '水果', '桃子', 'http://www.163.cn', '2'),
(18, '水果', '火龙果', 'http://www.163.cn', '3'),
(19, '水果', '提子', 'http://www.163.cn', '2'),
(20, '飞机', 'A380', 'http://www.g.cn', '4'),
(22, '天体', '火星', 'http://www.g.cn', '4'),
(27, '动物', '猫', 'http://www.sina.com', '3');select *
from ttt a
where 3>(select count(*) from ttt where `ylfl`=a.ylfl and yldj>a.yldj)
order by `ylfl`,yldj desc把3>逐渐变到5 就有问题了
还是我哪个yldj(相当于例子中的p)是varchar字段.感觉是这个的影响,如果改成int可能就正常了
但是比较大小MySql不是能自动转换类型么
LEFT JOIN TTt B ON A.ylfl=B.ylfl AND A.yldj>B.yldj
GROUP BY a.ylid,a.ylfl,a.ylmc,a.yllj,a.yldj
HAVING COUNT(B.ylID) <=5yldj有重复值
2 书籍 西游记 http://www.163.cn 4
7 水果 香蕉 http://www.163.cn 2
10 汽车 本田 http://www.163.cn 4
13 水果 釉子 http://www.163.cn 2
14 水果 鸭梨 http://www.163.cn 2
15 水果 芒果 http://www.163.cn 2
17 水果 桃子 http://www.163.cn 2
19 水果 提子 http://www.163.cn 2
20 飞机 A380 http://www.g.cn 4
22 天体 火星 http://www.g.cn 4
27 动物 猫 http://www.sina.com 3 结果是这样的,有6个水果了.而且水果没有分到一组,中间插进了一个'汽车',还有水果没有排序,应该葡萄第一个,火龙果第二个,按yldj由大到小排下来.这么麻烦的查询,存在么?不好弄就分着查,在把结果拼接起来了
-> from ttt a
-> where 6>(select count(*) from ttt where `ylfl`=a.ylfl and yldj>a.yldj)
-> order by `ylfl`,yldj desc;
+------+------+--------+---------------------+------+
| ylid | ylfl | ylmc | yllj | yldj |
+------+------+--------+---------------------+------+
| 2 | 书籍 | 西游记 | http://www.163.cn | 4 |
| 8 | 水果 | 苹果 | http://www.163.cn | 6 |
| 9 | 水果 | 西瓜 | http://www.163.cn | 4 |
| 16 | 水果 | 葡萄 | http://www.163.cn | 4 |
| 18 | 水果 | 火龙果 | http://www.163.cn | 3 |
| 17 | 水果 | 桃子 | http://www.163.cn | 2 |
| 19 | 水果 | 提子 | http://www.163.cn | 2 |
| 14 | 水果 | 鸭梨 | http://www.163.cn | 2 |
| 13 | 水果 | 釉子 | http://www.163.cn | 2 |
| 7 | 水果 | 香蕉 | http://www.163.cn | 2 |
| 15 | 水果 | 芒果 | http://www.163.cn | 2 |
| 22 | 天体 | 火星 | http://www.g.cn | 4 |
| 27 | 动物 | 猫 | http://www.sina.com | 3 |
| 20 | 飞机 | A380 | http://www.g.cn | 4 |
| 1 | 花草 | 竹子 | http://www.163.cn | 2 |
| 10 | 汽车 | 本田 | http://www.163.cn | 4 |
+------+------+--------+---------------------+------+
16 rows in set (0.02 sec)mysql>
SELECT a.ylid,a.ylfl,a.ylmc,a.yllj,a.yldj FROM TTt A
LEFT JOIN TTt B ON A.ylfl=B.ylfl AND A.yldj>B.yldj
GROUP BY a.ylid,a.ylfl,a.ylmc,a.yllj,a.yldj
HAVING COUNT(B.ylID) <=5
ORDER BY a.ylfl,a.yldj+------+--------+-----------+---------------------+------+
| ylid | ylfl | ylmc | yllj | yldj |
+------+--------+-----------+---------------------+------+
| 2 | 涔︾睄 | 瑗挎父璁? | http://www.163.cn | 4 |
| 27 | 鍔ㄧ墿 | 鐚? | http://www.sina.com | 3 |
| 22 | 澶╀綋 | 鐏槦 | http://www.g.cn | 4 |
| 19 | 姘存灉 | 鎻愬瓙 | http://www.163.cn | 2 |
| 17 | 姘存灉 | 妗冨瓙 | http://www.163.cn | 2 |
| 15 | 姘存灉 | 鑺掓灉 | http://www.163.cn | 2 |
| 14 | 姘存灉 | 楦ⅷ | http://www.163.cn | 2 |
| 13 | 姘存灉 | 閲夊瓙 | http://www.163.cn | 2 |
| 7 | 姘存灉 | 棣欒晧 | http://www.163.cn | 2 |
| 10 | 姹借溅 | 鏈敯 | http://www.163.cn | 4 |
| 1 | 鑺辫崏 | 绔瑰瓙 | http://www.163.cn | 2 |
| 20 | 椋炴満 | A380 | http://www.g.cn | 4 |
+------+--------+-----------+---------------------+------+
| 9 | 水果 | 西瓜 | http://www.163.cn | 4 |
| 16 | 水果 | 葡萄 | http://www.163.cn | 4 |
| 18 | 水果 | 火龙果 | http://www.163.cn | 3 |
| 17 | 水果 | 桃子 | http://www.163.cn | 2 |
| 19 | 水果 | 提子 | http://www.163.cn | 2 |
| 14 | 水果 | 鸭梨 | http://www.163.cn | 2 |
| 13 | 水果 | 釉子 | http://www.163.cn | 2 |
| 7 | 水果 | 香蕉 | http://www.163.cn | 2 |
| 15 | 水果 | 芒果 | http://www.163.cn | 2 这些水果多了.
想实现这样的查询数据库里有很多水果.比如20个,每个水果都有一个等级,可以一样
我想取出等级最高的6个,该怎么弄呢.如果第6个和第7个等级一样,没关系,随便取一个同级的就成同理,数据库里也有很多汽车,飞机,花草.也都取等级最高的前6个.最后把这些结果分好组.按照各自类别的等级排列好(等级高的放最上边),放在一个大数据集里.
如果数据库里按类别找的数据不够6个,那么有多少就取多少.比如只有5个,那么就都取出来,还是按照各自类别的等级排列好其实昨天的这个查询已经差不多可以了select *
from qqq a
where 3>(select count(*) from qqq where `type`=a.type and p>a.p)
order by `type`,p desc比如3>那么都最多取得3条,只是 5>时,一下取了10条左右,不知道什么原因
LEFT JOIN TTt B ON A.ylfl=B.ylfl AND A.yldj>B.yldj
GROUP BY a.ylid,a.ylfl,a.ylmc,a.yllj,a.yldj
HAVING COUNT(B.ylID) <=5
ORDER BY a.ylfl,a.yldjylid ylfl ylmc yllj yldj
2 书籍 西游记 http://www.163.cn 4
27 动物 猫 http://www.sina.com 3
22 天体 火星 http://www.g.cn 4
19 水果 提子 http://www.163.cn 2
17 水果 桃子 http://www.163.cn 2
15 水果 芒果 http://www.163.cn 2
14 水果 鸭梨 http://www.163.cn 2
13 水果 釉子 http://www.163.cn 2
7 水果 香蕉 http://www.163.cn 2
10 汽车 本田 http://www.163.cn 4
1 花草 竹子 http://www.163.cn 2
20 飞机 A380 http://www.g.cn 4没有问题嘛
我想取出等级最高的6个,该怎么弄呢.如果第6个和第7个等级一样,没关系,随便取一个同级的就成select *
from ttt a
where 6>(select count(*) from ttt where `ylfl`=a.ylfl and (yldj>a.yldj or (yldj=a.yldj and ylid>a.ylid)))
order by `ylfl`,yldj desc;mysql> select *
-> from ttt a
-> where 6>(select count(*) from ttt where `ylfl`=a.ylfl and (yldj>a.yldj or
(yldj=a.yldj and ylid>a.ylid)))
-> order by `ylfl`,yldj desc;
+------+------+--------+---------------------+------+
| ylid | ylfl | ylmc | yllj | yldj |
+------+------+--------+---------------------+------+
| 2 | 书籍 | 西游记 | http://www.163.cn | 4 |
| 27 | 动物 | 猫 | http://www.sina.com | 3 |
| 22 | 天体 | 火星 | http://www.g.cn | 4 |
| 8 | 水果 | 苹果 | http://www.163.cn | 6 |
| 9 | 水果 | 西瓜 | http://www.163.cn | 4 |
| 16 | 水果 | 葡萄 | http://www.163.cn | 4 |
| 18 | 水果 | 火龙果 | http://www.163.cn | 3 |
| 19 | 水果 | 提子 | http://www.163.cn | 2 |
| 17 | 水果 | 桃子 | http://www.163.cn | 2 |
| 10 | 汽车 | 本田 | http://www.163.cn | 4 |
| 1 | 花草 | 竹子 | http://www.163.cn | 2 |
| 20 | 飞机 | A380 | http://www.g.cn | 4 |
+------+------+--------+---------------------+------+
12 rows in set (0.01 sec)mysql>
2 书籍 西游记 http://www.163.cn 4
27 动物 猫 http://www.sina.com 3
22 天体 火星 http://www.g.cn 4
19 水果 提子 http://www.163.cn 2
17 水果 桃子 http://www.163.cn 2
15 水果 芒果 http://www.163.cn 2
14 水果 鸭梨 http://www.163.cn 2
13 水果 釉子 http://www.163.cn 2
7 水果 香蕉 http://www.163.cn 2
10 汽车 本田 http://www.163.cn 4
1 花草 竹子 http://www.163.cn 2
20 飞机 A380 http://www.g.cn 4 数量是对了,可是取得的水果等级排列不对.看6楼 8 | 水果 | 苹果 | http://www.163.cn | 6 |
| 9 | 水果 | 西瓜 | http://www.163.cn | 4 |
| 16 | 水果 | 葡萄 | http://www.163.cn | 4 |
| 18 | 水果 | 火龙果 | http://www.163.cn | 3 |
| 17 | 水果 | 桃子 | http://www.163.cn | 2 |
| 19 | 水果 | 提子 | http://www.163.cn | 2 |
| 14 | 水果 | 鸭梨 | http://www.163.cn | 2 |
| 13 | 水果 | 釉子 | http://www.163.cn | 2 |
| 7 | 水果 | 香蕉 | http://www.163.cn | 2 |
| 15 | 水果 | 芒果 | http://www.163.cn | 2 他这个等级排列是对的,就是数量不对,多了
还有我把yldj改成int类型了,为了方便
先按ylfl排序,再按yldj排序,你要的顺序是什么?
4在一起
3在一起
2在一起?
order by yldj desc,`ylfl`