方法一: 针对有 分类字段
专题id 即 该表的分类字段
// 文章表:
CREATE TABLE `er_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`theme_id` int(11) DEFAULT NULL COMMENT '专题id',
`title` varchar(50) NOT NULL,
`update_time` int(11) NOT NULL,
)
查询sql: 查询 每个专题的 前3篇文章
SELECT
a.id,a.title,a.update_time,a.theme_id
FROM
(
er_article AS a,
(SELECT
GROUP_CONCAT(id) AS ids
FROM
er_article
GROUP BY
theme_id ) AS b
)
WHERE
FIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 3
ORDER BY a.theme_id
语句解析1:
SELECT
GROUP_CONCAT(id) AS ids
FROM
er_article
GROUP BY theme_id
该语句运行结果:
GROUP_CONCAT(id) as ids 表示 将所有id 存入一个数组字符串ids. 若不加group by theme_id 分类, 则所有id存在一条数据中
语句解析2:
FIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 3
FIND_IN_SET(id,ids) 表示匹配字符串中对应的id,BETWEEN 1 AND 3 表示取前三条数据
结果如下。( ps:测试数据有我同学名,所以就码掉了,怪输入法呀哈哈~)
方法二: 针对无 分类字段 的表 ,需要筛选到 某个字段 无重复值
// 奖励详细表 (展示部分字段)
CREATE TABLE `admin_welfare_detail` (
`id` bigint NOT NULL AUTO_INCREMENT,
`game` varchar(255) DEFAULT NULL,
`name` varchar(255) NOT NULL DEFAULT '' ,
`platform` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
`server` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
`accname` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`player_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`player_lv` int NOT NULL ,
`reward_type` int NOT NULL ,
`config_money` varchar not null,
`player_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
)
查询sql:查询每个 玩家id 的 前2条数据
SELECT
a.id,
a.player_id,
a.name,
a.config_money
FROM
admin_welfare_detail a
WHERE
(
SELECT
count(*)
FROM
admin_welfare_detail b
WHERE
a.player_id = b.player_id
AND a.game = b.game
AND a.platform = b.platform
AND a.reward_type = b.reward_type
AND a.server = b.server
AND b.config_money > a.config_money
) < 2
ORDER BY
id
1.这堆a.x=b.x 是为了确认对比数据的一一对应,config_money那里,是为了获取最高金额的前n条。
(如果要取 后n条,子查询条件改成 a.config_money < b.config_money。)
eg:比如说一张成绩表,有字段 id,课程名,学生名,分数,要获取每科成绩最高分的前两个学生,此时这里的条件就变成 where a.课程名=b.课程名,然后获取条件就是a.分数>b.分数
2. 整条sql语句的意思是,先执行
查出所有数据来,先把这个总数据叫A1
然后子查询针对 A1每条数据 进行 select count(*) from admin_welfare_detail b where xxx b.config_money > a.config_money
假如说一个角色有3条数据,金额分别是 50 60 100, 那么执行流程就是:
第一轮,a.config_money = 50,那么有 60,100 大于50的,此时count=2 ,不符合
第二轮,a.config_money = 60,那么有 100 大于60的,此时count=1 ,符合
第三轮,a.config_money = 100,没有值大于100的,此时count=0 ,符合
我们上面sql语句里面是 <2 所以60、100符合条件。
结果:(有些数据数据库只有一条 ~)