V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
jackzhan
V2EX  ›  MySQL

小白问一下关于 mysql 分页的问题

  •  
  •   jackzhan · 2019-05-21 10:13:53 +08:00 · 4920 次点击
    这是一个创建于 2044 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是 SQL:
    SELECT m.id,m.nickname,m.phone,m.username,m.create_time, m.update_time,mr.role_desc,mr.role_id, mr.role_name FROM member m LEFT JOIN member_role mr ON m.id = mr.member_id ORDER BY mr.role_name
    查询结果:
    1 小九九 123456789 admin 2019-04-22 15:08:23 2019-04-22 15:08:31 超级管理员 1 admin
    2 测试 1 123456789 test1 2019-05-20 15:08:23 2019-05-20 15:08:23 测试 1 2 test1
    1 小九九 123456789 admin 2019-04-22 15:08:23 2019-04-22 15:08:31 测试 1 2 test1
    2 测试 1 123456789 test1 2019-05-20 15:08:23 2019-05-20 15:08:23 测试 2 3 test2

    查询出来的结果会通过 resultMap 中的 collection 封装,所有最终得到的数据会是 2 条 但是我通过分页去查的话,这会算 4 条数据,而不是 2 条

    有什么办法可以得到,我分页查询 4 条数据,而不是出现 2 条数据吗

    20 条回复    2019-05-21 13:20:00 +08:00
    LeeSeoung
        1
    LeeSeoung  
       2019-05-21 10:20:03 +08:00
    = =没细看 可能你需要的是 inner join ?
    GeekCourse
        2
    GeekCourse  
       2019-05-21 10:22:50 +08:00
    这是你代码层面或者说框架层面的问题,框架应该封装有获取总条数的方法
    jackzhan
        3
    jackzhan  
    OP
       2019-05-21 10:24:37 +08:00
    应该用的是 left 吧,因为有可能用户还没有赋予角色
    godgrp
        4
    godgrp  
       2019-05-21 10:25:32 +08:00
    group_concat(mr.role_name) , group by m.id
    LeeSeoung
        5
    LeeSeoung  
       2019-05-21 10:29:24 +08:00
    那我对你说的 collection 封装成两条就有疑惑了。。这四条结果是不一样的,你是怎么处理成两条的。
    jackzhan
        6
    jackzhan  
    OP
       2019-05-21 10:31:47 +08:00
    @LeeSeoung 不是很明显。。。吗,结果中有相同的,不同的就是封装成一个对象里面的数组中
    littleylv
        7
    littleylv  
       2019-05-21 10:33:24 +08:00
    我没搞错的话,你这表设计有点怪怪的。

    不是应该 用户表存一个角色表的 id 么?你咋是角色表存用户表的 id ?
    role: id role_name
    user: id role_id user_name
    jackzhan
        8
    jackzhan  
    OP
       2019-05-21 10:33:40 +08:00
    @godgrp 大佬,没用过这个 group_concat 函数,能和我的 sql 拼成可以运行的 sql,发一下吗
    TomVista
        9
    TomVista  
       2019-05-21 10:34:15 +08:00
    @jackzhan 问下 left join 左边不重复的话 查询的也不会重复对吧?
    zhongyong883
        10
    zhongyong883  
       2019-05-21 10:40:34 +08:00
    left join 应该就是 member 中有这些数据条目了,可以打印下 member 这张表
    jackzhan
        11
    jackzhan  
    OP
       2019-05-21 10:45:42 +08:00
    @littleylv 这是关联表,多对多的
    mezi04
        12
    mezi04  
       2019-05-21 10:45:59 +08:00
    1. 在 collection 里用 select 属性指定 SQL,但这样会产生多次查询。
    2. 先查主记录,在代码里发第二次查询请求你 left join 那张表的数据,再拼上去。
    3. 终极方案:搞定你的产品经理。
    leafre
        13
    leafre  
       2019-05-21 10:46:44 +08:00
    看不出问题,自己 debug
    jackzhan
        14
    jackzhan  
    OP
       2019-05-21 10:48:06 +08:00
    @mezi04 指定 sql 得话,这个操作应该不行,多对多的话,产生的查询太多了
    jackzhan
        15
    jackzhan  
    OP
       2019-05-21 10:53:17 +08:00
    @mezi04 你之前碰到这种怎么解决的
    jookr
        16
    jookr  
       2019-05-21 11:21:04 +08:00
    表设计有问题,一个 id 一个角色。
    关系是 m.role_id=mr.id
    mezi04
        17
    mezi04  
       2019-05-21 11:25:06 +08:00
    @jackzhan #15 优先搞定你的产品经理,让 TA 接受这个。不行的话,方案 2。
    airfling
        18
    airfling  
       2019-05-21 11:29:27 +08:00
    一对多的问题,你的 resultMap 的结果集是 reduce 后的,你这样应该是封装对象的,而不是直接用 resultmap,会比较好理解一些
    gawoo
        19
    gawoo  
       2019-05-21 11:55:27 +08:00
    SELECT
    m.id,
    m.nickname,
    m.phone,
    m.username,
    m.create_time,
    m.update_time,
    mr.role_desc,
    mr.role_id,
    mr.role_name
    FROM
    (select * from member LIMIT 1, 10) m
    LEFT JOIN member_role mr ON m.id = mr.member_id
    ORDER BY mr.role_name
    不考虑其它因素的话就这样解决了
    godgrp
        20
    godgrp  
       2019-05-21 13:20:00 +08:00
    创建新回复过程中遇到一些问题:
    请不要在每一个回复中都包括外链,这看起来像是在 spamming
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5828 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:49 · PVG 09:49 · LAX 17:49 · JFK 20:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.