› 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 · May 21, 2019 · 6034 views
    This topic created in 2692 days ago, the information mentioned may be changed or developed.

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

    不是应该 用户表存一个角色表的 id 么?你咋是角色表存用户表的 id ?
    role: id role_name
    user: id role_id user_name
    jackzhan
        8
    jackzhan  
    OP
       May 21, 2019
    @godgrp 大佬,没用过这个 group_concat 函数,能和我的 sql 拼成可以运行的 sql,发一下吗
    TomVista
        9
    TomVista  
       May 21, 2019
    @jackzhan 问下 left join 左边不重复的话 查询的也不会重复对吧?
    zhongyong883
        10
    zhongyong883  
       May 21, 2019
    left join 应该就是 member 中有这些数据条目了,可以打印下 member 这张表
    jackzhan
        11
    jackzhan  
    OP
       May 21, 2019
    @littleylv 这是关联表,多对多的
    mezi04
        12
    mezi04  
       May 21, 2019
    1. 在 collection 里用 select 属性指定 SQL,但这样会产生多次查询。
    2. 先查主记录,在代码里发第二次查询请求你 left join 那张表的数据,再拼上去。
    3. 终极方案:搞定你的产品经理。
    leafre
        13
    leafre  
       May 21, 2019
    看不出问题,自己 debug
    jackzhan
        14
    jackzhan  
    OP
       May 21, 2019
    @mezi04 指定 sql 得话,这个操作应该不行,多对多的话,产生的查询太多了
    jackzhan
        15
    jackzhan  
    OP
       May 21, 2019
    @mezi04 你之前碰到这种怎么解决的
    jookr
        16
    jookr  
       May 21, 2019
    表设计有问题,一个 id 一个角色。
    关系是 m.role_id=mr.id
    mezi04
        17
    mezi04  
       May 21, 2019
    @jackzhan #15 优先搞定你的产品经理,让 TA 接受这个。不行的话,方案 2。
    airfling
        18
    airfling  
       May 21, 2019
    一对多的问题,你的 resultMap 的结果集是 reduce 后的,你这样应该是封装对象的,而不是直接用 resultmap,会比较好理解一些
    gawoo
        19
    gawoo  
       May 21, 2019
    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  
       May 21, 2019
    创建新回复过程中遇到一些问题:
    请不要在每一个回复中都包括外链,这看起来像是在 spamming
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   800 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 22:21 · PVG 06:21 · LAX 15:21 · JFK 18:21
    ♥ Do have faith in what you're doing.