TP5 使用IN查询时如何限制条数

1、实现思想

1.1、首先建立一个表作例子,如下:
image

其中表里面的数据如下:


image

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

输入的结果如下


image

从上面我们可以看出子查询的是后面三个字段,而我们要的是前面三个字段,只要取前面三个字段就可以了。


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);

输出结果如下

image

综上,我们可以知道对应IN查询的字段是子查询相等的条件,将主查询的id作为组,并且比子查询大。

1、需要u1.type = u2.type AND u1.id > u2.id条件
2、需要group('u1.id')
3、需要左连接,不然取出的数字会比写入的数字少1份
4、需要having("COUNT( u1.id ) < 3 ")

你可能感兴趣的:(TP5 使用IN查询时如何限制条数)