1、实现思想
1.1、首先建立一个表作例子,如下:
其中表里面的数据如下:
2、MYSQL实现
2.1、接下来我们开始用Navicat输出数据
SELECT * FROM `fa_test_user`
- 我们将上面的代码进行改装,筛选出类型为1,2,3的用户,每种类型 限制输出3条
SELECT
*
FROM
`fa_test_user` u1
LEFT JOIN `fa_test_user` `u2` ON `u1`.`type` = `u2`.`type`
AND `u1`.`id` > `u2`.`id`
WHERE
u1.type IN ( 1, 2, 3 )
GROUP BY
u1.id
HAVING
COUNT( u1.id ) < 3
ORDER BY
u1.type DESC
输入的结果如下
从上面我们可以看出子查询的是后面三个字段,而我们要的是前面三个字段,只要取前面三个字段就可以了。
3、TP5实现
$user = db('test_user')->select();
$lastSql = db('test_user')->getLastSql(); //获取最后一次查询
$this->success($user,$lastSql);
- 我们将上面的代码进行子查询
$user = db('test_user')
->alias('u1')
->join('test_user u2', 'u1.type = u2.type AND u1.id > u2.id', 'left')
->whereIn('u1.type', [1, 2, 3])
->group('u1.id')
->having("COUNT( u1.id ) < 3 ")
->order('u1.type', 'DESC')
->field(['u1.id','u1.type','u1.name'])
->select();
$lastSql = db('test_user')->getLastSql();
$this->success($user, $lastSql);
输出结果如下
综上,我们可以知道对应IN查询的字段是子查询相等的条件,将主查询的id作为组,并且比子查询大。
1、需要u1.type = u2.type AND u1.id > u2.id条件
2、需要group('u1.id')
3、需要左连接,不然取出的数字会比写入的数字少1份
4、需要having("COUNT( u1.id ) < 3 ")