一段经典的Group by 分页程序

        private DataTable GetDataTable(ModalAshxParams mp, out int TotalCount, bool pager = true)
        {
            var QueryParams = new
            {
                RiQiStart = mp.Request("RiQiStart"),
                RiQiEnd = mp.Request("RiQiEnd"),
                ZhouQi = mp.Request("ZhouQi")
            };
            System.Text.StringBuilder filter = new System.Text.StringBuilder();
            if (QueryParams.RiQiStart != "")
            {
                if (filter.ToString() != "")
                {
                    filter.Append(" and ");
                }
                filter.Append("统计日期 >='" + QueryParams.RiQiStart + "'");
            }
            if (QueryParams.RiQiEnd != "")
            {
                if (filter.ToString() != "")
                {
                    filter.Append(" and ");
                }
                filter.Append("统计日期 <='" + QueryParams.RiQiEnd + "'");
            }
            string fields = "'' as 统计周期,统计日期,avg(总电话量) as 总电话量,avg(已注册声纹电话量) as 已注册声纹电话量,avg(总录音数量) as 总录音数量,avg(客户满意数量) as 客户满意数量,avg(客户不满录音数量) as 客户不满录音数量,avg(坐席态度模型判断非可疑录音数) as 坐席态度模型判断非可疑录音数,avg(坐席态度模型判断可疑录音数) as 坐席态度模型判断可疑录音数,avg(客户情绪指数) as 客户情绪指数,avg(坐席态度指数) as 坐席态度指数";
            string groupby = "统计日期";
            string orderby = "统计日期 desc";
            if (QueryParams.ZhouQi == "日")
            {
                groupby = "统计日期";
            }
            else if (QueryParams.ZhouQi == "周")
            {
                fields = fields.Replace("统计日期", "datepart(ww,统计日期) as 统计日期");
                fields += ",datepart(yy,统计日期) as 统计年份";
                groupby = "datepart(ww,统计日期),datepart(yy,统计日期)";
                orderby = "datepart(yy,统计日期) desc,datepart(ww,统计日期) desc";
            }
            else
            {
                fields = fields.Replace("统计日期", "datepart(mm,统计日期) as 统计日期");
                fields += ",datepart(yy,统计日期) as 统计年份";
                groupby = "datepart(mm,统计日期),datepart(yy,统计日期)";
                orderby = "datepart(yy,统计日期) desc,datepart(mm,统计日期) desc";
            }

            //BLL.instance.WriteLog_Info("satify", filter.ToString());
            DataTable dt;

            //dt = new Entity.tblStatisticsDateIndex().Select_GroupBy_OrderBy(fields, filter.ToString(), groupby, mp.OrderField + " " + mp.Sorting).Tables[0];
            //TotalCount = dt.Rows.Count;
            string ssql = SqlClass.Util.GetSqlPage(Entity.tblStatisticsDateIndex.TN_TableName, fields, filter.ToString(), groupby, "", orderby, mp.Pageindex, mp.Pagesize);
            BLL.instance.WriteLog_Info("GetSqlPage", ssql);
            dt = new Entity.tblStatisticsDateIndex().SelectPageOutTotal(Entity.tblStatisticsDateIndex.TN_TableName, fields, filter.ToString(), groupby, "", orderby, mp.Pageindex, mp.Pagesize, out TotalCount, "", null).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                if (QueryParams.ZhouQi == "日")
                {
                    dr["统计周期"] = Convert.ToDateTime(dr["统计日期"]).ToString("yyyy-MM-dd");
                }
                else if (QueryParams.ZhouQi == "周")
                {
                    dr["统计周期"] = dr["统计年份"].ToString() + "年" + "第" + dr["统计日期"].ToString() + "周";
                }
                else
                {
                    dr["统计周期"] = dr["统计年份"].ToString() + "年" + dr["统计日期"].ToString() + "月";
                }
            }
            return dt;
        }

当group by 为聚合函数时,order by 也应该为聚合函数,如orderby = "datepart(yy,统计日期) desc,datepart(mm,统计日期) desc",否则会提示order by 的字段不在聚合函数中

### MyBatis 中实现左连接一对多分页查询 在处理数据库查询时,特别是在涉及复杂关系的数据表之间执行操作时,MyBatis 提供了强大的功能来简化开发人员的工作。对于左连接(`LEFT JOIN`)的一对多分页查询场景,可以采用如下方式: #### SQL 查询语句设计 为了有效地获取父实体及其关联子实体列表并应用分页逻辑,在构建 `SELECT` 语句时需注意几点事项: - 使用外键约束定义两个表之间的联系; - 利用聚合函数如 `GROUP_CONCAT()` 或者窗口函数根据具体需求收集相关记录; - 应用合适的索引来优化性能。 针对一对多的关系模型,假设存在两张表分别为订单(`orders`)和订单项(`order_items`),其中每条订单可能对应多个订单项,则可以通过下面的方式编写SQL: ```sql SELECT o.*, GROUP_CONCAT(oi.item_id) AS item_ids FROM orders o LEFT JOIN order_items oi ON o.order_id = oi.order_id WHERE o.status = 'active' AND (o.customer_name LIKE '%${searchText}%' OR EXISTS ( SELECT 1 FROM order_items WHERE order_id=o.order_id AND product_name LIKE '%${searchText}%' )) ORDER BY o.create_time DESC LIMIT #{start},#{size} ``` 此段代码实现了基于关键词模糊匹配的条件过滤以及按创建时间降序排列的结果集截取[^1]。 #### Mapper XML 文件配置 接着是在Mapper文件里声明相应的接口方法签名,并映射上述自定义SQL到Java对象上。这里展示了一个简单的例子用于说明如何设置resultMap属性从而完成复杂的嵌套结构转换工作: ```xml <resultMap id="OrderWithItemsResult" type="com.example.Order"> <id property="orderId" column="order_id"/> <!-- other columns mapping --> <collection property="items" ofType="com.example.Item"> <id property="itemId" column="item_id"/> <!-- other Item properties mappings --> </collection> </resultMap> <select id="findOrdersByPage" resultMap="OrderWithItemsResult" parameterType="map"> ${selectSqlString} </select> ``` 此处利用了 `<collection>` 标签指定集合类型的成员变量名及元素类别;而 `${}` 表达式的运用允许动态拼接部分SQL片段以适应不同上下文环境下的调用需求[^2]。 #### Java Service 层封装 最后一步就是在服务层内组装好必要的参数并通过调用DAO层暴露出来的API达成最终目的——即返回带有分页信息的对象实例给控制器层面做进一步渲染呈现: ```java public Page<Order> findOrderByPage(String searchText, int page, int size){ Map<String,Object> params=new HashMap<>(); String selectSql= "SELECT o.*, GROUP_CONCAT(DISTINCT oi.item_id SEPARATOR ',') as items"; params.put("selectSql",selectSql); params.put("searchText",searchText); params.put("start",(page-1)*size); params.put("size",size); List<Order> list=mapper.findOrdersByPage(params); long total=mapper.countTotalRecords(searchText); // 另一个单独的count查询 return new Page<>(list,total,page,size); } ``` 以上便是有关于MyBatis框架下实施带有限制条件的左联结一对多模式并且支持分页特性的整体解决方案概述[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值