精华内容
下载资源
问答
  • 主要介绍了mysql一对多关联查询分页错误问题的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • mysql一对多关联查询时主表分页时,对from后的主表数据进行如图中的条件过滤,分页即可. 然后在进行与其他表的关联查询即可.

    这里写图片描述

    这里写图片描述

    mysql一对多关联查询时主表分页时,对from后的主表数据进行如图中的条件过滤,分页即可. 然后在进行与其他表的关联查询即可.

    展开全文
  • mysql 一对多关联查询 练习

    万次阅读 2019-03-29 16:07:12
    场景:假设一个学生有多门课程,一门课程有多个学生(虽然两者是多对多关系,但本次假设为一对多)。 学生表: SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `student`...

    场景:假设一个学生有多门课程,一门课程有多个学生(虽然两者是多对多关系,但本次假设为一对多)。

    学生表:

    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `student`
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (
      `ID` int(22) NOT NULL,
      `StuName` varchar(22) DEFAULT NULL,
      `StuAge` int(22) DEFAULT NULL,
      `Cid` int(22) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of student
    -- ----------------------------
    INSERT INTO `student` VALUES ('1', '张三', '66', '3');
    INSERT INTO `student` VALUES ('2', '李四', '77', '3');
    INSERT INTO `student` VALUES ('4', '王五', '25', '4');

    课程表:

    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `course`
    -- ----------------------------
    DROP TABLE IF EXISTS `course`;
    CREATE TABLE `course` (
      `ID` int(22) NOT NULL,
      `CouName` varchar(22) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of course
    -- ----------------------------
    INSERT INTO `course` VALUES ('1', '语文');
    INSERT INTO `course` VALUES ('2', '数学');
    INSERT INTO `course` VALUES ('3', '英语');
    INSERT INTO `course` VALUES ('4', '地理');
    INSERT INTO `course` VALUES ('5', '政治');
    INSERT INTO `course` VALUES ('6', '历史');
    INSERT INTO `course` VALUES ('7', '化学');
    INSERT INTO `course` VALUES ('8', '物理');

     

    需求 1:查询学生名对应的课程名

    select s.StuName,c.CouName from Student s INNER JOIN Course c ON s.Cid = c.ID;

    需求2:查询每门课程的选修人数

    SELECT c.CouName,COUNT(DISTINCT s.StuName) AS '选修人数' FROM Student s RIGHT JOIN Course c ON s.Cid = c.ID
    GROUP BY c.CouName;

    展开全文
  • 可以用sql直接实现下图的任意种形式吗![图片说明](https://img-ask.csdn.net/upload/201710/19/1508401941_485897.png)
  • MySQL SELECT COUNT 一对多关联查询去重

    千次阅读 2019-09-01 10:40:31
    一对多 关系时,统计一 的一方数量,这时使用 SELECT COUNT 就容易出现统计数目不准,有重复的现象。 2 问题复现 举例: 有一用户表(user) 和一张 用户图像表(user_photo),用户表与用户图像表属于一...

    1 摘要

    在实际项目中,通常会遇到多表关联查询的问题,这个时候在做分页查询的时候,可能会出现因关联关系而导致查询数量不正确的问题。如一对多 关系时,统计 的一方数量,这时使用 SELECT COUNT 就容易出现统计数目不准,有重复的现象。

    2 问题复现

    举例:
    有一用户表(user) 和一张 用户图像表(user_photo),用户表与用户图像表属于一对多关系,即一个用户可以拥有多张图像
    用户表:

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id 主键',
      `user_name` varchar(30) DEFAULT NULL COMMENT '用户名',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
    
    

    用户图像表:

    DROP TABLE IF EXISTS `user_photo`;
    CREATE TABLE `user_photo` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '用户相册 id',
    `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户 id',
    `photo_url` varchar(255) NULL DEFAULT '' COMMENT '用户图片链接地址',
    PRIMARY KEY (`id`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户图像表';
    
    

    要求: 使用分页查询用户信息,用户信息中需要包含用户的图像

    查询语句:
    统计用户数量:

    SELECT COUNT(u.id)
    FROM `user` u 
    LEFT JOIN `user_photo` up ON up.user_id = u.id
    

    查询结果:

    16
    

    实际用户数量为:

    SELECT COUNT(*) 
    FROM `user`;
    
    

    结果为: 11

    这时就出现了查询数量不准确的问题,因为是属于一对多的关系,所以,如果一个用户有两张图像的话,查询就会出现两条结果,从而导致查询数量不准确

    3 解决办法

    使用 DISTINCT 去除重复,保证每一个用户具有唯一性

    具体查询:

    SELECT COUNT(DISTINCT(u.id))
    FROM `user` u 
    LEFT JOIN `user_photo` up ON up.user_id = u.id
    

    查询结果为: 11
    符合实际用户数量

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

    展开全文
  • 我现在有两张表 table1,table2,其中table1的字段(id,name),表table2的字段(id, ...需要查询出来 (name和status为0的总数)的集合该怎么写sql?status的值只有0或者1. table1的id和table2的table1_Id是主外键关联的。
  • 主要介绍了MySQL 多表关联一对多查询实现取最新一条数据的方法,结合实例形式详细分析了MySQL 多表关联一对多查询实现取最新一条数据相关原理、实现方法与操作注意事项,需要的朋友可以参考下
  • 分页查询是后台项目中最常见的一种操作,在一对多(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

    展开全文
  • MySQL 多表关联一对多查询取最新的一条数据

    万次阅读 多人点赞 2019-01-23 18:10:27
    MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 由于历史原因,表结构设计不合理;产品告诉我说需要导出客户信息数据,需要导出客户的 所属行业,纳税...
  • 里我们来以实例讲解Java的MyBatis框架对MySQL中数据的关联查询,包括一对多、多对一的关联查询以及自身关联映射的方法等,需要的朋友可以参考下
  • MyBatis实现一对一,一对多关联查询

    万次阅读 多人点赞 2019-09-25 00:20:31
    关联查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成 具体实现如下 准备数据库表结构与数据 班级classes与老师teacher是一对一的关系 班级...
  • Mysql学习中 ,单表查询每个人都很...但是表之间的关联查询对于初学者是很难掌握的,以下是我学习中,结合老师所讲例子作的总结,主要就是三张表的关联查询。还包括group by操作。Join on;left join on;group by。
  • MyBatis之一对多关联查询

    万次阅读 2017-03-09 09:57:26
    MyBatis一对多关联

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 175,236
精华内容 70,094
关键字:

mysql一对多关联查询

mysql 订阅