精华内容
下载资源
问答
  • 分页查询是后台项目中最常见的一种操作,在一对(one to many)的关系中,如何根据主进行分页是一个较为棘手的问题,尤其是查询条件既包含主又包含从/关联表的。一般情况下,不是查询结果条数不正确,就是一...

    1 摘要

    分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中,如何根据主表进行分页是一个较为棘手的问题,尤其是查询条件既包含主表又包含从表/关联表的。一般情况下,不是查询结果条数不正确,就是一对多中的多的一方只能显示一条信息。本文将记录作者自己在项目中针对一对多分页查询主表和关联表都有查询条件的一种解决方案。

    关于分页查询,也可参考作者之前的笔记:

    mysql多表联合查询分页查询结果条数错误问题

    2 情景复现

    2.1 数据模型

    在先前的分页查询笔记中使用的是用户-用户图像这一简单的一对多模型,在本次示例中使用另一种更加复杂一些的模型,多对多模型: 文章与标签模型。

    一篇文章可以对应多个标签,同时一个标签也可以对应多篇文章。不过这里依旧以文章为主表。

    文章表:

    CREATE TABLE `article` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章 id,主键',
      `title` varchar(100) NOT NULL DEFAULT '' COMMENT '文章标题',
      `content` text  NOT NULL COMMENT '文章内容',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章表';
    

    标签表:

    CREATE TABLE `article_tag` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章标签 id,主键',
      `tag_name` varchar(20) NOT NULL DEFAULT '' COMMENT '标签名称',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章标签表';
    
    

    在多对多关系中,建议使用中间表进行关联

    文章与标签的关联表:

    CREATE TABLE `article_to_tag` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章-标签中间表',
      `article_id` bigint(20) NOT NULL COMMENT '文章 id',
      `tag_id` bigint(20) NOT NULL COMMENT '标签 id',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章-标签关联表';
    

    2.2 核心代码

    由于在前边的笔记中已经介绍过一对多分页查询的方式: 使用子查询,因此这里就直接进入正题,不再演示不合理或者说错误的查询方法。

    需求: 根据条件查询文章,该条件既包含主表的字段,也(可能)包含子表的字段,要求使用分页查询

    统计查询结果总条数:

    SELECT COUNT(DISTINCT(a.id))
    FROM `article` a 
    LEFT JOIN `article_to_tag` att ON att.article_id = a.id 
    LEFT JOIN `article_tag` at ON at.id = att.tag_id
    WHERE a.id > 2
        AND at.tag_name LIKE CONCAT(CONCAT('%', '级'),'%')
    
    

    分页查询结果:

    SELECT 
      a.id, a.title, a.content, at.tag_name
    FROM (
        SELECT item_a.*
    		FROM `article` item_a
    		LEFT JOIN `article_to_tag` item_att ON item_att.article_id = item_a.id 
    		LEFT JOIN `article_tag` item_at ON item_at.id = item_att.tag_id
    		WHERE item_a.id > 2
            AND item_at.tag_name LIKE CONCAT(CONCAT('%', '级'),'%')
    		GROUP BY item_a.id
    		ORDER BY item_a.id DESC
    		LIMIT 0,5
    ) a 
    LEFT JOIN `article_to_tag` att ON att.article_id = a.id 
    LEFT JOIN `article_tag` at ON at.id = att.tag_id
    GROUP BY a.id, at.id
    ORDER BY a.id DESC
    
    

    这里演示的SQL中查询条件为: 文章的 id > 2,同时文章的标题中包含 「级」

    注意事项: 这里的子查询只是将查询总结果按照需要的方式排列,但是实际返回到前端的数据依然需要进行排序和分组,否则,依然会出现查询结果不符合要求的情况。即内层子查询和外层查询都需要进行排序和分组

    统计条数的查询结果为:

    4
    

    分页查询结果为:

    分页查询结果
    从结果总可以看出 id 为 5,6,7,8 的文章满足以上要求

    以上便是分页查询一对多主表子表都有查询条件的解决方案

    2.3 测试数据

    本示例中演示的测试数据,感兴趣的可以自行实践

    文章标签数据:

    -- 批量插入文章标签
    INSERT INTO `article_tag`(`tag_name`) VALUES
        ('初级'),
    		('中级'),
    		('高级'),
    		('超高级'),
    		('spring'),
    		('springBoot'),
    		('springMVC');
    

    文章表数据:

    -- 批量插入文章
    INSERT INTO `article` (`title`, `content`) VALUES
        ('好风光', '今天天气好晴朗,处处好风光'),
    		('冰雨', '冷冷的冰雨在我脸上胡乱地拍,你就像一个刽子手把我出卖'),
    		('学习', '好好学习,天天向上'),
    		('静夜思', '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'),
    		('冬日里的一把火', '你就像那一把火,熊熊火焰燃烧了我'),
    		('演员', '简单点,说话的方式简单点。递进的情绪请省略,你又不是个演员'),
    		('小苹果', '你是我的小丫小苹果,怎么爱你都不嫌多'),
    		('雨一直下', '雨一直下,气氛不算融洽');
    

    文章与标签关联数据:

    -- 批量给文章添加标签
    INSERT INTO `article_to_tag` (`article_id`, `tag_id`) VALUES
        (1,1),
        (1,2),
        (1,4),
        (2,3),
        (2,5),
        (3,6),
        (4,7),
        (5,1),
        (5,2),
        (5,3),
        (6,4),
        (6,1),
        (6,5),
        (6,7),
        (7,6),
        (7,1),
        (8,3),
        (8,6),
        (8,7),
        (8,4);
    

    2.4 拓展一点

    文章通常有用户进行收藏,而在查询文章时,也可以显示文章的收藏量数据(这个需求是正常需求)

    文章的收藏量不同于文章的阅读量,文章的阅读量可以用一个字段就能够实现,有用户点增加值即可,但是用户收藏就不一样,因为用户可以查询到自己收藏的内容,这是一个正常的需求,反过来,某一篇文章被哪些用户收藏,这一功能也是可以实现的(不过这个需求个人感觉有些过分,有泄露隐私的嫌疑)

    OK,既然要实现用户收藏文章这一功能,就需要专门创建一个用户文章收藏表。

    用户文章收藏表:

    CREATE TABLE `article_user_favorite` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户收藏表id',
      `user_id` bigint(20) NOT NULL COMMENT '用户 id',
      `article_id` bigint(20) NOT NULL COMMENT '文章 id',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户文章收藏表';
    

    插入一些测试数据:

    -- 批量收藏文章
    INSERT INTO `article_user_favorite`(`user_id`, `article_id`) VALUES
        (1,1),
    		(1,2),
    		(1,3),
    		(1,4),
    		(1,5),
    		(1,6),
    		(1,7),
    		(1,8),
    		(2,1),
    		(3,1),
    		(4,1),
    		(2,2),
    		(2,6),
    		(3,1),
    		(4,1),
    		(5,1),
    		(3,2),
    		(3,6),
    		(3,7),
    		(4,8),
    		(4,5),
    		(5,2),
    		(5,3),
    		(5,4),
    		(5,5),
    		(5,6),
    		(5,7),
    		(5,8),
    		(4,4),
    		(3,3);
    
    

    还是按照上边的查询条件: 文章 id > 2, 文章的标签包含「级」
    这里需要显示每一篇文章的收藏量

    查询SQL:

    SELECT 
      a.id, a.title, a.content, at.tag_name,
    	COUNT(auf.id) AS countUserFavorite
    FROM (
        SELECT item_a.*
    		FROM `article` item_a
    		LEFT JOIN `article_to_tag` item_att ON item_att.article_id = item_a.id 
    		LEFT JOIN `article_tag` item_at ON item_at.id = item_att.tag_id
    		WHERE item_a.id > 2
            AND item_at.tag_name LIKE CONCAT(CONCAT('%', '级'),'%')
    		GROUP BY item_a.id
    		ORDER BY item_a.id DESC
    		LIMIT 0,5
    ) a 
    LEFT JOIN `article_to_tag` att ON att.article_id = a.id 
    LEFT JOIN `article_tag` at ON at.id = att.tag_id
    LEFT JOIN `article_user_favorite` auf ON auf.article_id = a.id
    GROUP BY a.id, at.id
    ORDER BY a.id DESC
    

    查询结果:

    查询结果-2

    个人公众号:404Code,记录半个互联网人的技术与思考,感兴趣的可以关注.
    404Code

    展开全文
  • 对数据进行展示的时候,产品希望随意拿一条子的数据关联展示出来,用了很多方案,但是都不够好。 sql查询取子任意一条,个字段的方案 最终找到一个高效的方案记录如下: 需求如图: 最早的第一套方案: ...

    有个业务场景,主表中一条数据,在子表中有多条详情数据。对数据进行展示的时候,产品希望随意拿一条子表的数据关联展示出来,用了很多方案,但是都不够好。

    sql查询取子表任意一条,多个字段的方案

    最终找到一个高效的方案记录如下:

    需求如图:

    最早的第一套方案:

    select distinct
    A.ID,
    A.Title,
    A.[Description],
    A.xx1,
    A.xx2,
    A.xx3,
    
    B.ID as BId,
    B.xxA,
    B.xxB,
    B.xxC,
    B.xxD
    from A
    left join B on A.ID=B.CgId
    

      该方案一般情况下没有问题,但是如果B表的字段值不一样,就会出现结果仍然重复问题。

    第二种方案:

    用了分组和聚合函数 max ,min这种

    但是个人感觉太有局限性,不是太对,就不粘贴代码了。

     

    第三种方案:

    用了很多top 1

    select 
    A.ID,
    A.Title,
    A.[Description],
    A.xx1,
    A.xx2,
    A.xx3,
    
    (select top 1 B.ID from B where A.ID=b.CgId) as BId,
    (select top 1 B.xxA from B where A.ID=b.CgId) as xxA,
    (select top 1 B.xxB from B where A.ID=b.CgId) as xxB,
    (select top 1 B.xxC from B where A.ID=b.CgId) as xxC,
    (select top 1 B.xxD from B where A.ID=b.CgId) as xxD
    from A
    left join B on A.ID=B.CgId

    由于需要子表的字段太多,这种方法一看效率就比较低,但是是不是真的特别低没做测试。

     

    第四种方案,是我认为看着效率就比较高的方案:

    select * from 
        (
            select 
                a.*,
                (select top 1 Id from B as b where b.CgId =a.ID)as bid 
            from A as a
        )
    as temp
    left join B as b2 on temp.bid=b2.Id

     

    这种方法首先将主表与子表数据其中一条的Id联系起来作为一个“中间表”,然后后“中间表”与子表连接。

    个人推荐这种方案,效率您可以坐下测试。

     

    该方案是有群里面一个大神提供的。

     

    转载于:https://www.cnblogs.com/Tpf386/p/5856415.html

    展开全文
  • mybatis一对多关联查询分页解决方案

    千次阅读 2019-01-08 01:06:52
    1、sql:分页查询分页查询获取id,再根据这些id 查询数据 select a.id, a.xm, a.xb, a.ksno, a.zkzh, a.bmxh, a.zjlx, a.zjno, a.xp, a.status, a.dizhi, a.xuexiao, a.banji, a.cscode, a. fenpei_cscode, a...

    1、sql:分页查询

    先分页查询获取id,再根据这些id 查询数据

     select a.id, a.xm, a.xb, a.ksno, a.zkzh, a.bmxh, a.zjlx, a.zjno, a.xp, a.status, a.dizhi, a.xuexiao, a.banji, a.cscode, a.
        fenpei_cscode, a.fenzu_code, a.fenzu_num, a.fenzu_datetime, a.tijiandian_id, a.kaoshi_code, a.
        updatetime, a.bak1, a.bak2, a.csrq, a.mzdm, a.wyyzdm, a.kslbdm, a.zzmmdm, a.bylbdm, a.xxdm, a.hkszddm,a.print_status, a.print_datetime, a.zhiwen_status, a.zhiwen_datetime, 
    		a.querenbiao_status, a.querenbiao_datetime, a.zhujian_status, a.zhujian_datetime, a.zhiwenqueren_way,b.zong_status,d.id zdyj_id,d.keyNum,d.valueStr
     from t_bmk a,tj_huizong b,t_bmk_zdyj c,t_zdyj d where a.id=b.ks_id and a.id=c.ks_id and c.zdyj_id=d.id and a.id in(
    select
     id
     from
    (
        select a.id,row_number() over
        (
    	 order by ksno
        ) num
     from t_bmk a,tj_huizong b where a.id=b.ks_id and exists(select 1 from t_bmk_zdyj where ks_id=a.id)) as ta where ta.num >1 and ta.num<30);

    sqlserver 存储过程

    
    ALTER PROCEDURE [dbo].[tiaoxingma_getAllByPage]
    (
      @txm_ksno AS varchar(50) ,
    	@txm_zjno AS varchar(50) ,
    	@txm_bmxh AS varchar(50) ,
    	@txm_xm AS varchar(50) ,
    	@txm_xuexiao AS varchar(200) ,
    	@txm_xb AS varchar(1) ,
    	@txm_printStatus AS varchar(10) ,
    	@txm_qsbjbh AS varchar(50) ,
    	@txm_zzbjbh AS varchar(50) ,
    	@txm_qsbmxh AS varchar(50) ,
    	@txm_zzbmxh AS varchar(50) ,
      @startnum AS int ,
      @endnum AS int 
    	)
    AS
    BEGIN
    declare @sql nvarchar(2000)	
    set @sql='
       select a.id, a.xm, a.xb, a.ksno, a.zkzh, a.bmxh, a.zjlx, a.zjno, a.xp, a.status, a.dizhi, a.xuexiao, a.banji, a.cscode, a.
        fenpei_cscode, a.fenzu_code, a.fenzu_num, a.fenzu_datetime, a.tijiandian_id, a.kaoshi_code, a.
        updatetime, a.bak1, a.bak2, a.csrq, a.mzdm, a.wyyzdm, a.kslbdm, a.zzmmdm, a.bylbdm, a.xxdm, a.hkszddm,a.print_status, a.print_datetime, a.zhiwen_status, a.zhiwen_datetime, 
    		a.querenbiao_status, a.querenbiao_datetime, a.zhujian_status, a.zhujian_datetime, a.zhiwenqueren_way,b.zong_status,d.id zdyj_id,d.keyNum,d.valueStr
     from t_bmk a,tj_huizong b,t_bmk_zdyj c,t_zdyj d where a.id=b.ks_id and a.id=c.ks_id and c.zdyj_id=d.id and a.id in(
    select
     id
     from
    (
        select a.id,row_number() over
        (
    	 order by ksno
        ) num
     from t_bmk a,tj_huizong b where a.id=b.ks_id and exists(select 1 from t_bmk_zdyj where ks_id=a.id) ';
    IF(@txm_ksno is not null and @txm_ksno!='')
    	BEGIN
    	set @sql=@sql+' and a.ksno like ''%'+@txm_ksno+'%'' '
    	END
    IF(@txm_zjno is not null and @txm_zjno!='')
    	BEGIN
    	set @sql=@sql+' and a.zjno like ''%'+@txm_zjno+'%'' '
    	END
    IF(@txm_bmxh is not null and @txm_bmxh!='')
    	BEGIN
    	set @sql=@sql+' and a.bmxh like ''%'+@txm_bmxh+'%'' '
    	END
    IF(@txm_xm is not null and @txm_xm!='')
    	BEGIN
    	set @sql=@sql+' and a.xm like ''%'+@txm_xm+'%'' '
    	END
    IF(@txm_xuexiao is not null and @txm_xuexiao!='')
    	BEGIN
    	set @sql=@sql+' and a.xuexiao like ''%'+@txm_xuexiao+'%'' '
    	END
    IF(@txm_xb is not null and @txm_xb!='')
    	BEGIN
    	set @sql=@sql+' and a.xb ='+@txm_xb
    	END
    IF(@txm_printStatus is not null and @txm_printStatus!='')
    	BEGIN
    	set @sql=@sql+' and a.print_status ='''+@txm_printStatus+''''
    	END
    IF(@txm_qsbjbh is not null and @txm_qsbjbh!='')
    	BEGIN
    	set @sql=@sql+' and a.banji >= '+@txm_qsbjbh
    	END
    IF(@txm_zzbjbh is not null and @txm_zzbjbh!='')
    	BEGIN
    	set @sql=@sql+' and a.banji <='+@txm_zzbjbh
    	END
    IF(@txm_qsbmxh is not null and @txm_qsbmxh!='')
    	BEGIN
    	set @sql=@sql+' and a.bmxh >= '''+@txm_qsbmxh+''''
    	END
    IF(@txm_zzbmxh is not null and @txm_zzbmxh!='')
    	BEGIN
    	set @sql=@sql+' and a.bmxh <= '''+@txm_zzbmxh+''''
    	END
    set @sql=@sql+') as ta where ta.num > '+CONVERT(varchar(50),@startnum) + ' and ta.num <='+CONVERT(varchar(50), @endnum) +')'
    exec sp_executesql @sql
    END
    
    
    

    2、查询数据总数:
    sql

      select count(1) 
     from t_bmk a,tj_huizong b where a.id=b.ks_id and exists(select 1 from t_bmk_zdyj where ks_id=a.id)

    sqlserver存储过程:

    
    
    
    
    
    ALTER PROCEDURE [dbo].[tiaoxingma_getAllByPage_count]
    (
      @txm_ksno AS varchar(50) ,
    	@txm_zjno AS varchar(50) ,
    	@txm_bmxh AS varchar(50) ,
    	@txm_xm AS varchar(50) ,
    	@txm_xuexiao AS varchar(200) ,
    	@txm_xb AS varchar(10) ,
    	@txm_printStatus AS varchar(10) ,
    	@txm_qsbjbh AS varchar(50) ,
    	@txm_zzbjbh AS varchar(50) ,
    	@txm_qsbmxh AS varchar(50) ,
    	@txm_zzbmxh AS varchar(50) 
    	)
    AS
    BEGIN
    declare @sql nvarchar(2000)	
    set @sql='
       select count(1) 
     from t_bmk a,tj_huizong b where a.id=b.ks_id and exists(select 1 from t_bmk_zdyj where ks_id=a.id) ';
    IF(@txm_ksno is not null and @txm_ksno!='')
    	BEGIN
    	set @sql=@sql+' and a.ksno like ''%'+@txm_ksno+'%'' '
    	END
    IF(@txm_zjno is not null and @txm_zjno!='')
    	BEGIN
    	set @sql=@sql+' and a.zjno like ''%'+@txm_zjno+'%'' '
    	END
    IF(@txm_bmxh is not null and @txm_bmxh!='')
    	BEGIN
    	set @sql=@sql+' and a.bmxh like ''%'+@txm_bmxh+'%'' '
    	END
    IF(@txm_xm is not null and @txm_xm!='')
    	BEGIN
    	set @sql=@sql+' and a.xm like ''%'+@txm_xm+'%'' '
    	END
    IF(@txm_xuexiao is not null and @txm_xuexiao!='')
    	BEGIN
    	set @sql=@sql+' and a.xuexiao like ''%'+@txm_xuexiao+'%'' '
    	END
    IF(@txm_xb is not null and @txm_xb!='')
    	BEGIN
    	set @sql=@sql+' and a.xb ='+@txm_xb
    	END
    IF(@txm_printStatus is not null and @txm_printStatus!='')
    	BEGIN
    	set @sql=@sql+' and a.print_status ='+@txm_printStatus
    	END
    IF(@txm_qsbjbh is not null and @txm_qsbjbh!='')
    	BEGIN
    	set @sql=@sql+' and a.banji >= '+@txm_qsbjbh
    	END
    IF(@txm_zzbjbh is not null and @txm_zzbjbh!='')
    	BEGIN
    	set @sql=@sql+' and a.banji <='+@txm_zzbjbh
    	END
    IF(@txm_qsbmxh is not null and @txm_qsbmxh!='')
    	BEGIN
    	set @sql=@sql+' and a.bmxh >='''+@txm_qsbmxh+''''
    	END
    IF(@txm_zzbmxh is not null and @txm_zzbmxh!='')
    	BEGIN
    	set @sql=@sql+' and a.bmxh <= '''+@txm_zzbmxh+''''
    	END
    exec sp_executesql @sql
    END
    
    
    
    
    

    3、mybatis xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.zr.dao.TxmMapper">
        <resultMap id="BaseResultMap" type="com.zr.model.KaoSheng">
            <id column="id" jdbcType="BIGINT" property="id"/>
            <result column="xm" jdbcType="NVARCHAR" property="xm"/>
            <result column="xb" jdbcType="INTEGER" property="xb"/>
            <result column="ksno" jdbcType="VARCHAR" property="ksno"/>
            <result column="zkzh" jdbcType="VARCHAR" property="zkzh"/>
            <result column="bmxh" jdbcType="VARCHAR" property="bmxh"/>
            <result column="zjlx" jdbcType="VARCHAR" property="zjlx"/>
            <result column="zjno" jdbcType="VARCHAR" property="zjno"/>
            <result column="xp" jdbcType="VARCHAR" property="xp"/>
            <result column="status" jdbcType="INTEGER" property="status"/>
            <result column="dizhi" jdbcType="VARCHAR" property="dizhi"/>
            <result column="xuexiao" jdbcType="VARCHAR" property="xuexiao"/>
            <result column="banji" jdbcType="VARCHAR" property="banji"/>
            <result column="cscode" jdbcType="VARCHAR" property="cscode"/>
            <result column="fenpei_cscode" jdbcType="VARCHAR" property="fenpeiCscode"/>
            <result column="fenzu_code" jdbcType="VARCHAR" property="fenzuCode"/>
            <result column="fenzu_num" jdbcType="INTEGER" property="fenzuNum"/>
            <result column="fenzu_datetime" jdbcType="TIMESTAMP" property="fenzuDatetime"/>
            <result column="tijiandian_id" jdbcType="BIGINT" property="tijiandianId"/>
            <result column="kaoshi_code" jdbcType="VARCHAR" property="kaoshiCode"/>
            <result column="updatetime" jdbcType="TIMESTAMP" property="updatetime"/>
            <result column="bak1" jdbcType="BIGINT" property="bak1"/>
            <result column="bak2" jdbcType="VARCHAR" property="bak2"/>
            <result column="csrq" jdbcType="VARCHAR" property="csrq"/>
            <result column="mzdm" jdbcType="VARCHAR" property="mzdm"/>
            <result column="wyyzdm" jdbcType="VARCHAR" property="wyyzdm"/>
            <result column="kslbdm" jdbcType="VARCHAR" property="kslbdm"/>
            <result column="zzmmdm" jdbcType="VARCHAR" property="zzmmdm"/>
            <result column="bylbdm" jdbcType="VARCHAR" property="bylbdm"/>
            <result column="xxdm" jdbcType="VARCHAR" property="xxdm"/>
            <result column="hkszddm" jdbcType="VARCHAR" property="hkszddm"/>
            <result column="print_status" jdbcType="VARCHAR" property="printStatus"/>
            <result column="print_datetime" jdbcType="TIMESTAMP" property="printDatetime"/>
            <result column="zhiwen_status" jdbcType="VARCHAR" property="zhiwenStatus"/>
            <result column="zhiwen_datetime" jdbcType="TIMESTAMP" property="zhiwenDatetime"/>
            <result column="querenbiao_status" jdbcType="VARCHAR" property="querenbiaoStatus"/>
            <result column="querenbiao_datetime" jdbcType="TIMESTAMP" property="querenbiaoDatetime"/>
            <result column="zhujian_status" jdbcType="VARCHAR" property="zhujianStatus"/>
            <result column="zhujian_datetime" jdbcType="TIMESTAMP" property="zhujianDatetime"/>
            <result column="zhiwenqueren_way" jdbcType="VARCHAR" property="zhiwenquerenWay"/>
            <result column="zong_status" jdbcType="VARCHAR" property="zongStatus"/>
            <result column="querenbiao_frequency" jdbcType="INTEGER" property="querenbiaoFrequency" />
            <collection property="zdyjs" ofType="com.zr.model.Zdyj">
                <id column="zdyj_id" jdbcType="INTEGER" property="id"/>
                <result column="keyNum" jdbcType="VARCHAR" property="keynum"/>
                <result column="valueStr" jdbcType="VARCHAR" property="valuestr"/>
                <result column="type" jdbcType="INTEGER" property="type"/>
            </collection>
        </resultMap>
        <select id="tiaoxingma_getAllByPage" statementType="CALLABLE" resultMap="BaseResultMap">
        {CALL tiaoxingma_getAllByPage(#{ksno},#{zjno},#{bmxh},#{xm},#{xuexiao},#{xb},#{printStatus},#{qsbjbh},#{zzbjbh},#{qsbmxh},#{zzbmxh},#{startnum},#{endnum})}
      </select>
        <select id="tiaoxingma_getAllByPage_count" resultType="INTEGER" statementType="CALLABLE">
        {CALL tiaoxingma_getAllByPage_count(#{ksno},#{zjno},#{bmxh},#{xm},#{xuexiao},#{xb},#{printStatus},#{qsbjbh},#{zzbjbh},#{qsbmxh},#{zzbmxh})}
      </select>
     
    </mapper>


     

    展开全文
  • 这没什么好谈的,大多数我们分页对单分页比较,对多表分页我们可以通过视图来实现,当然还有其他的方式,在这儿,我以一个实例展示下使用我们的RDIFramework.NET来实现多表联合查询分页的实现,我以Web的...

    RDIFramework.NET 中多表关联查询分页实例

    RDIFramework.NET,基于.NET的快速信息化系统开发、整合框架,给用户和开发者最佳的.Net框架部署方案。该框架以SOA范式作为指导思想,作为异质系统整合与互操作性、分布式应用提供了可行的解决方案。

      分页非常的常见,基本任何项目都会涉及到分页,这没什么好谈的,大多数我们分页对单表的分页比较多,对多表的分页我们可以通过视图来实现,当然还有其他的方式,在这儿,我以一个实例展示下使用我们的RDIFramework.NET来实现多表联合查询分页的实现,我以Web的形式展示,WinForm方法一样,分页后的界面如下图所示:  

      UI上看不出什么,现在我们以代码说明如何实现,使用RDIFramework.NET实现上面的界面代码非常的简单,首先我们看下页面代码,代码如下: 

    <%@ Page Language="C#" MasterPageFile="~/Site.Master"  AutoEventWireup="true" CodeBehind="ProductInMuliPage.aspx.cs" Inherits="RDIFramework.WebApp.demo.ProductInMuliPage" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">   
        <div id="toolbar">
            <a id="a_add" style="float:left" href="javascript:;" plain="true" class="easyui-linkbutton" icon="icon-add" title="新增">新增</a>
            <div class='datagrid-btn-separator'>
            </div>
            <a id="a_edit" style="float:left" href="javascript:;" plain="true" class="easyui-linkbutton" icon="icon-pencil" title="修改">修改</a>
            <div class='datagrid-btn-separator'></div>
            <a id="a_delete" style="float:left" href="javascript:;" plain="true" class="easyui-linkbutton" icon="icon-delete" title="删除">删除</a>
        </div>
    
         <table id="list1"></table>      
        <script type="text/javascript">
            $(function () {           
                autoResize({ dataGrid: '#list1', gridType: 'datagrid', callback: grid.bind, height: 0 });
    
                $('#a_add').click(CRUD.add);
                $('#a_edit').click(CRUD.edit);
                $('#a_delete').click(CRUD.del);
            });
            var grid = {
                bind: function (winSize) {
                    $('#list1').datagrid({
                        url: '/demo/handler/ProductIn.ashx?action=GetMultiPage',
                        toolbar: '#toolbar',
                        title: "数据列表",
                        iconCls: 'icon icon-list',
                        width: winSize.width,
                        height: winSize.height,
                        nowrap: false, //折行
                        rownumbers: true, //行号
                        striped: true, //隔行变色
                        idField: 'ID', //主键
                        sortName: 'CREATEON',
                        sortOrder: 'desc',
                        singleSelect: true, //单选
                        frozenColumns: [[]],
                        columns: [[
                { title: '主键', field: 'ID', width: 120, hidden: true },
                    { title: '入库单编码', field: 'CODE', width: 130 },
                    { title: '入库日期', field: 'INDATE', width: 150 },
                         { title: '入库类型', field: 'INTYPE', width: 100 },
                    { title: '保管员', field: 'CUSTODIAN', width: 70 },
                    { title: '品名', field: 'FULLNAME', width: 100 },
                         { title: '数量', field: 'AMOUNT', width: 80 },
                    { title: '单价', field: 'UNITPRICE', width: 150 }
                        ]],
                        pagination: true,
                        pageSize: 5,
                        pageList: [5, 10, 20]
                    });
                },
                getSelectedRow: function () {
                    return $('#list1').datagrid('getSelected');
                },
                reload: function () {
                    $('#list1').datagrid('clearSelections').datagrid('reload', { filter: '' });
                }
            };
        </script>
    </asp:Content>

      上面的代码,我们就实现了页面部分,现在我们来看下分页的代码,分页在我们框架中已经做了很完美的支持,可以通过多种方式,支持不同类型的数据库的分页实现,直接调用接口方法即可实现。我们看下上面的页面部分调用的ashx中的方法“/demo/handler/ProductIn.ashx?action=GetMultiPage”代码如下:  

    private string GetProductMultiPage()
    {
        var returnJson = "[]";
        var managerMain = new CASE_PRODUCTIN_MAINManager(this.dbHelper, Utils.UserInfo);
       
        var _pageindex = pageindex > 0 ? pageindex : 1;
        var _pagesize = pagesize > 0 ? pagesize : 20;
        int recordCount;
        managerMain.CurrentTableName = @"(SELECT tab1.ID,tab1.CODE,tab1.INDATE,tab1.INTYPE,tab1.CUSTODIAN,tab1.CREATEON,tab2.FULLNAME,tab2.AMOUNT,tab2.UNITPRICE 
                                            FROM dbo.CASE_PRODUCTIN_MAIN tab1 
                                            INNER JOIN dbo.CASE_PRODUCTIN_DETAIL tab2
                                            ON tab1.ID = tab2.CASE_PRODUCTIN_MAIN_ID) pageData";
    
        managerMain.SelectField = "*";
        var dtProductIn = managerMain.GetDTByPage(out recordCount, _pageindex, _pagesize, null, "CREATEON DESC");
        if (dtProductIn != null && dtProductIn.Rows.Count > 0)
        {
            returnJson = JSONhelper.FormatJSONForEasyuiDataGrid(recordCount, dtProductIn);
        }
    
        return returnJson;
    }

     上面的代码可供开发者参考,这样不管你是多少表的关联查询,分页的问题都可以迎刃而解,WinForm的类似。  


    作者: EricHu 
    出处:http://blog.csdn.net/chinahuyong  
    Email:406590790@qq.com 
    QQ交流:406590790 
    QQ群:237326100 
    框架博客:http://blog.csdn.net/chinahuyong 
                   http://www.cnblogs.com/huyong
    RDIFramework.NET,基于.NET的快速信息化系统开发、整合框架,给用户和开发者最佳的.Net框架部署方案。 
    关于作者:高级工程师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目,在面向对象、面向服务以及数据库领域有一定的造诣。现主要从事基于 RDIFramework.NET 框架的技术开发、咨询工作,主要服务于金融、医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。 
    如有问题或建议,请多多赐教! 
    本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过邮箱或QQ 联系我,非常感谢。

    展开全文
  • Mybatis Plus 提供的基础分页查询只能满足单,不足以支持多表,如果想要多表关联查询并且分页的话只能自己手动实现sql,今天就给大家介绍一下如何快速的基于注解方式实现多表分页查询。 实现方案 无非就是自己手动...
  • 在项目中,多表联合查询是最常见的情景之一,在多表联合查询同时进行分页查询时,可能会出现查询结果条数不正确的情况或者说查询结果有遗漏的情况。针对这种问题,本文将探讨其解决方案。 解决办法为使用子查询的...
  • 分页查询优化方案总结一、 常用分页查询(1)未用索引(2)使用索引二、 分页查询优化1 最大id查询法2 between and3 limit id4 延迟关联5 分表查询6 索引7 缓存 函数、扫描记录过多等都会影响查询的速度,如果提高...
  • PageHelper一对多查询分页解决方案

    千次阅读 2019-11-13 18:00:26
    2、查询结果为一对时用PageHelper分页解决方案: Page page= PageHelper.startPage(pojo.getPage(),pojo.getPageSize()); List<AlarmExtDto> dataList=sensorAlarmDao.getAlarmExt(conditi...
  • 【MyBatis】使用MyBatis的分页组件PageHelper时,多表关联下使用别名查询时,前台传参过来,根据参数排序的解决方案
  • 分页多表关联查询有多种方式 @Query使用 查询所有: public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable { @Query(value = ...
  • 多表分页, photoType 我之前的参数是用Wrappers传入的使用上一样 就是ew.xxx 而已 具体看官网 参数时建议使用,并且在实体字段上增加表名前缀 @Select("select * from photo p LEFT JOIN label_detail ld on ld....
  • 若要分页查询A的a_name,同时要关联查询B的b_name, 由于A的一列可能对应个B记录,所以若将sql写成A和B等值连接,并用collection标签将b_name封装进一个list,将会出现重复列 如下例: aid a_name ...
  • 【mySQL】mysql 分页查询

    万次阅读 多人点赞 2019-05-05 14:36:37
    MySQL:limit分页公式、总页数公式 1) limit分页公式 (1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录 limit (curPage-1)*pageSize,pageSize (2)用的地方:sql语句中 select * from student...
  • 业务需求:张表关联查询、结果分页、结果直接返回 Map 结构(不进行 DTO 封装),能根据某字段进行结果过滤筛选,该字段为 null 或者 "" 查询所有。 实现方案方案一: @Query(nativeQuery = true, value = ...
  • 大数据量的分页查询优化方案欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • 数据库水平分库分表后的数据分页查询解决方案

    万次阅读 热门讨论 2018-09-14 08:08:51
    分库分表的策略,依项目需求而定,这里采用的是常规的做法:根据取模的方式,假设我们水平分库2个,每个库又水平拆2个 既总共有4个,查询的时候默认没有按照其他的条件进行排序,假设我们要查询第41页的数据,每页显示10...
  • mybatis一对多关联查询+pagehelper->分页错误。 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: pagehelper不支持这种查询: ...暂时解决方案: ...
  • mybatis的关联嵌套查询--分页详解

    千次阅读 2018-11-25 19:46:21
    而第一种的方式是分两次查询,就不会有分页的问题,所以解决方案就是把你的collection写成第一种的方式 2. 折叠结果集映射不上数据 1. 数据库 -- 区域: CREATE TABLE `area` ( `id` bigint(11) NOT NULL...
  • 方案1:首先使用索引完成排序分页操作,最后根据主键关联回原表查询所需要的其他列内容。 1.普通分页查询: explain select film_id,description from film order by title limit 50,5; 扫描了全,使用了filesort...
  • 今天开发遇到一个问题, mabatis关联查询一对进行分页的时候返回数据丢失(不算丢失只是数据库是10条,返回少了,是属于机制问题)研究了一个小时才终于找到了原因,现在记录一下, 案例一:产生问题   刚...
  • 优化分页查询

    2021-03-12 17:01:12
    优化分页查询 一般分页查询时,通过创建...在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其他列内容。 优化思路二 该方案适用于主键自增的,可以把Limit 查询转换成某个位置的查询 ...
  • JPA使用nativequery多表关联查询返回自定义实体类

    万次阅读 热门讨论 2018-07-18 19:28:58
    JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询。所以想要寻找一种好用的解决方案。   JPA多表关联的实现方式 1.使用Specification实现映射关系匹配,如@...
  • 我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量: select * from table where column=xxx order by xxx limit 1,20。 当数据量比较小时(100万以内),无论你翻到哪一页,性能都...
  • 如果是遇到多表连接查询,且查询条件也需要根据Join的的某个字段做过滤的情况下,如何优化分页查询limit带来的性能开销? select a.*,b.* from a left join b on a.b_id=b.id where a.xx=? and b.xx=? 这真的不是...
  • 文章目录[隐藏]关于mybatis中collection一对多关联查询分页出错问题总结 首页博客学院 下载论坛APP 问答商城活动VIP会员专题招聘ITeyeGitChat 图文课 写博客 消息 原 关于mybatis中collection一对多关联查询分页出错...
  • 在Activiti工作流引擎项目Saas改造中,会遇到说租户用户的情况,那么每个表单数据量也会变,单百万级需求就成为一个必须要解决的问题。 ...那么使单能够支持一些数据的查询就尤为重...
  • 使用PageHelper插件的时候,发现前端向后台成功传入当前页pageNum、每页大小pageSize,但查询后前端并未显示分页效果 @RequestMapping("/list") public ModelAndView findByPage( @RequestParam(defaultValue = ...
  • 项目中可能会遇到数据量很大,同时有需要多表联合查询的时候,这个时候,在计算页码的时候,就会遇到如何处理的问题。 在项目中我的处理方案 mysql数据库索引优化(一般情况下可以满足需求) 前端获取数据时,不...
  • 前几天写了一遍关于laravel分表关联查询,但是我个人觉得还不算完美,于是今天重新看了一下laravel模型的底层代码,终于写出我暂时觉得最满意的代码-laravel风格,简洁、优雅是核心。 下面直接上demo代码,主要是3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,956
精华内容 12,782
关键字:

关联多表的分页查询方案