我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法。sql查询 语句如何解析成“分页查询”和“总统计”两条语句。可能,很多人在处理“总统计”是这样:“select count(*) from (<sql原查询语句>) ”,而不是把原sql查询语句中columns替换成“count(*)”;相比前者统计查询效率高不高,大家心知肚明。“分页查询”很简单,对于mysql语句就是在原sql查询语句后面加上“limit 数字 offset 数字”
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; namespace MySqlTest
{
class Program
{
static void Main(string[] args)
{
string sql = "select id,code,name,modifytime,storeid from retail_cashier where profileid=@profileid and storeId=@storeId order by id";
var parts = MysqlPageHelper.BuildPageQuery(sql, , ); Console.WriteLine("sql:{0};",parts.Sql);
Console.WriteLine("SqlCount:{0}", parts.SqlCount);
Console.WriteLine("SqlPage:{0}",parts.SqlPage);
Console.WriteLine("SqlOrderBy:{0}", parts.SqlOrderBy);
Console.ReadKey();
}
} public class MysqlPageHelper
{
public Regex RegexColumns = new Regex(@"\A\s*SELECT\s+((?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|.)*?)(?<!,\s+)\bFROM\b",
RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); public Regex RegexDistinct = new Regex(@"\ADISTINCT\s",
RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); public Regex RegexOrderBy =
new Regex(
@"\bORDER\s+BY\s+(?!.*?(?:\)|\s+)AS\s)(?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|[\[\]`""\w\(\)\.])+(?:\s+(?:ASC|DESC))?(?:\s*,\s*(?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|[\[\]`""\w\(\)\.])+(?:\s+(?:ASC|DESC))?)*",
RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); private string _sqlSelectRemoved = null;
public void SplitSql(string sql, long skip, long take)
{
this.Sql = sql;
this.SqlCount = null;
this.SqlOrderBy = null; // 从中提取列
var m = RegexColumns.Match(this.Sql);
if (!m.Success)
throw new Exception("无法解析分页查询的SQL语句"); // sql语句中columns替换成count(*)
var g = m.Groups[];
this._sqlSelectRemoved = this.Sql.Substring(g.Index); if (RegexDistinct.IsMatch(this._sqlSelectRemoved))
this.SqlCount = this.Sql.Substring(, g.Index) + "COUNT(" + m.Groups[].ToString().Trim() + ") " + sql.Substring(g.Index + g.Length);
else
this.SqlCount = this.Sql.Substring(, g.Index) + "COUNT(*) " + sql.Substring(g.Index + g.Length); // sql语句最后order by
m = RegexOrderBy.Match(this.SqlCount);
if (m.Success)
{
g = m.Groups[];
this.SqlOrderBy = g.ToString();
this.SqlCount = this.SqlCount.Substring(, g.Index) + this.SqlCount.Substring(g.Index + g.Length);
}
//分页读取数据
SqlPage = string.Format("{0}\nLIMIT {1} OFFSET {2}", this.Sql, take, skip);
} public static MysqlPageHelper BuildPageQuery(string sql, long skip, long take)
{
var page=new MysqlPageHelper();
page.SplitSql(sql,skip,take);
return page;
} public string Sql { get; private set; }
public string SqlPage { get;private set; }
public string SqlCount { get;private set; }
public string SqlOrderBy { get;private set; }
}
}
sql查询语句如何解析成分页查询?的更多相关文章
-
MySQL 查询语句--------------进阶8:分页查询
#进阶8:分页查询 /* 应用场景:要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 from 表 [join type] join 表2 on 连接条件 [wher ...
-
ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)
ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题: 浏览器安全限制了前端脚本跨站点的访问资源, ...
-
SQL语句(六)分页查询和联合查询
目录 一.分页查询 语法格式 应用 二.联合查询 语法和作用 特点 应用 UNION和UNION ALL的区别 一.分页查询 语法格式 SELECT 查询列表 FROM 表 WHERE ... GRO ...
-
Sql 语句拼接 多条件分页查询
Create PROCEDURE [dbo].[Proc_B2B_GetBatchMainPaging] @StationNo AS varchar() , --m @StationName AS v ...
-
T-SQL查询语句(三):多表查询
SQL查询语句<三>:多表查询 (也叫连接查询,此处为基于两个表的连接查询)如果一个查询需要对多个表进行操作就称为连接查询,连接查询的结果集或结果称为表之间的连接.连接查询实际上是通过各个 ...
-
MySQL 数据库 查询语句的基本操作,单表查询,多表查询
1.查询语句的基本操作 - select - from - where - group by - having - distinct - order by - limit - 聚合函数: count, ...
-
QBC查询、离线条件查询(DetachedCriteric)和分页查询模版
一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的 ...
-
mysql查询语句 和 多表关联查询 以及 子查询
原文地址: http://blog.csdn.net/github_37767025/article/details/67636061 1.查询一张表: select * from 表名: 2.查询指 ...
-
【MySQL】条件查询之排序聚合分组分页查询
排序查询 语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的. DESC:降序. 注意: 如果有多个排序条件,则 ...
随机推荐
-
video.js-H5视频播放库
video.js是一款很流行的html5视频播放插件.很适合在移动端播放视频(比如微信网页),功能强大,且支持降级到flash,兼容ie8.官网:http://videojs.com/ git& ...
-
python数据库(mysql)操作
一.软件环境 python环境默认安装了sqlite3,如果需要使用sqlite3我们直接可以在python代码模块的顶部使用import sqlite3来导入该模块.本篇文章我是记录了python操 ...
-
Java 线程池的介绍以及工作原理
在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗.2. 提高响应速度: ...
-
McAfee Host Intrusion Prevention
McAfee Host Intrusion Prevention是一款集防火墙功能和HIPS于一身的主动防御和防火墙软件,将其与 McAfee VirusScan Enterprise 8.5/8.7 ...
-
hibernate ThreadLocal
代码 package com.pb.hibernate.util; import org.hibernate.HibernateException; import org.hibernate.Sess ...
-
WebApi发布到外网提示404问题
今天在做微信接口的对接,需要把webApi发布到服务器,放上去的时候,提示404 找了以后,发现了这段代码,粘贴上去就可以用了 在web.config添加如下节点 <system.webServ ...
-
Promise 返回值
then 和 catch 中返回 promise,会在这个 promise resolve 或 reject 的时候,把 resolve 或 reject 的结果作为参数传给后面的 then 或 ca ...
-
Windows环境安装Django步骤
前提:已经安装Python 1.先从Django官网下载压缩包:https://www.djangoproject.com/download/ 2.解压Django,如我解压到 D:\Python\D ...
-
JAVA钩子方法+模板方法
模板方法: 写一个抽象类,这个抽象类有多个抽象方法,里面设立一个模板方法,这个模板方法也可以称之为模板算法,设立不同方法的执行顺序,封装业务流程,暴露出去: 模板方法模式的特点很好总结,它将一般性的可 ...
-
LigerUi中为Grid表加上序号,并调整适当宽度!(实例)
LigerUi中为Grid表加上序号,并调整适当宽度!(实例) dataAction: 'server', pageSize: 20, toolbar: {}, url: 'ndl ...