首页   注册   登录
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
V2EX  ›  MySQL

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

  •  
  •   jackzhan · 154 天前 · 2807 次点击
    这是一个创建于 154 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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