MariaDB社区

标题: 这样的sql语句怎么实现 (分组找出组内前3) [打印本页]

作者: 夜貓孒    时间: 2013-5-7 17:49
标题: 这样的sql语句怎么实现 (分组找出组内前3)

用mysql语句实现 右边那样的结果,sql怎么写呢,请各位大侠帮忙
作者: kider    时间: 2013-5-8 11:24
你的意思应该是: 要找出前两项分组的情况下的第三项的前3 。

一哥们写了个SQL实现的很好:
  1. SELECT * FROM
  2. (SELECT @num := (SELECT COUNT(0) FROM test AS b WHERE b.kid = a.kid AND b.mid >= a.mid) AS num,
  3.         a.ver,a.kid,a.mid
  4.          FROM         test AS a) AS c
  5.   WHERE c.num <= 3
  6. ORDER BY c.kid DESC, c.mid DESC;
复制代码

作者: kider    时间: 2013-5-8 14:03
附表结构及数据:
  1. CREATE TABLE `test` (
  2.   `ver` varchar(10) DEFAULT NULL,
  3.   `kid` int(11) DEFAULT NULL,
  4.   `mid` int(11) DEFAULT NULL
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  6. insert  into `test`(`ver`,`kid`,`mid`) values ('0.0.1',203,29),('0.0.1',203,4),('0.0.1',203,38),('0.0.1',203,86),('0.0.1',203,42),('0.0.1',203,546),('0.0.1',203,34),('0.0.1',204,15),('0.0.1',204,20),('0.0.1',204,371),('0.0.1',204,78),('0.0.1',204,57),('0.0.1',204,38),('0.0.1',204,960),(NULL,NULL,0);
复制代码

作者: 夜貓孒    时间: 2013-5-9 17:08
kider 发表于 2013-5-8 11:24
你的意思应该是: 要找出前两项分组的情况下的第三项的前3 。

一哥们写了个SQL实现的很好:

嗯不错不错,能不能分别控制第二列(kid)和第三列(mid)的个数呢?我测试了一下,修改这个数字(c.num <= 4 )可以控制第三列的个数,但是第二列我如果想让它显示三个不同的项,那该怎么办
(例如:
ver     kid     mid
0.0.1  204   960
0.0.1  204   371
0.0.1  203   546
0.0.1  203   86
0.0.1  202  119
0.0.1  202   78

作者: kider    时间: 2013-5-9 17:48

作者: 小苏    时间: 2013-5-9 18:04
加个条件GROUP BY一个kid然后TOP一下个数
作者: wangwl_s    时间: 2013-5-31 13:37
我也回复个
SELECT
t.ver,t.kid,t.mid FROM test t
WHERE kid IS NOT NULL AND 3 > (SELECT COUNT(1) FROM test WHERE kid = t.kid AND MID > t.mid)
ORDER BY kid DESC, MID desc




欢迎光临 MariaDB社区 (http://123.56.88.72/) Powered by Discuz! X3.2