sqlsugar mysql count 为什么需要经过一层子查询 返回

C#论坛 老数据
4 2142

对某个表求count 

        var total = _db.Queryable<t_meetinguserscope>().Where(p => p.company_id == companyId && departUserIds.Contains(p.userid)).GroupBy(g => g.b_id).Count();

出来的sql语句是:

SELECT
	COUNT(1)
FROM
	(
		SELECT
			`userid`,
			`username`,
			`usertype`,
			`helpcontent`,
			`id`,
			`b_id`,
			`company_id`,
			`sub_company_id`,
			`create_by`,
			`create_user_id`,
			`create_time`,
			`deletemark`,
			`enabled`
		FROM
			`t_meetinguserscope`
		WHERE
			(
				(`company_id` = '') and userid in ('1231')
			)
		GROUP BY
			`b_id`
	) CountTabl

查看了一下explain:

image.png

正常来说应该如下:只需一步查询,也不需要产生一个派生表

SELECT
	COUNT(1)
FROM
	
			`t_meetinguserscope`
		WHERE
			(
				(`company_id` = '') and userid in ('1231')
			)
		GROUP BY
			`b_id`	

image.png


是否是出于其它数据兼容性考虑,才这样做?是否可以做到不求count 的时候不行执行一遍子查询?

热忱回答4

  • 没有groupbyCount不会去包一层,一般你用Groupby应该用Select(it=>sqlfunc.xxcount(it=>it.xx)).first()

    0 回复
  • GROUPBY 一般配合SELECT用 不是直接COUNT

    0 回复
  • 粤叶 粤叶 VIP0
    2020/12/11

    @fate stay night:你说的这种方式也是可行的

    image.png

    可能有点不是很完美的地方就是

    可能是我个人我问题:

    1、sql 语法习惯问题 

    2、产生没有必要的排序

    image.png

    0 回复
  • 不用到 top 分页不会有排序,我这也是为了简化我ORM自带的逻辑考虑

    0 回复