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

2019-05-21 10:13:53 +08:00
 jackzhan

这是 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 条数据吗

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

不是应该 用户表存一个角色表的 id 么?你咋是角色表存用户表的 id ?
role: id role_name
user: id role_id user_name
jackzhan
2019-05-21 10:33:40 +08:00
@godgrp 大佬,没用过这个 group_concat 函数,能和我的 sql 拼成可以运行的 sql,发一下吗
TomVista
2019-05-21 10:34:15 +08:00
@jackzhan 问下 left join 左边不重复的话 查询的也不会重复对吧?
zhongyong883
2019-05-21 10:40:34 +08:00
left join 应该就是 member 中有这些数据条目了,可以打印下 member 这张表
jackzhan
2019-05-21 10:45:42 +08:00
@littleylv 这是关联表,多对多的
mezi04
2019-05-21 10:45:59 +08:00
1. 在 collection 里用 select 属性指定 SQL,但这样会产生多次查询。
2. 先查主记录,在代码里发第二次查询请求你 left join 那张表的数据,再拼上去。
3. 终极方案:搞定你的产品经理。
leafre
2019-05-21 10:46:44 +08:00
看不出问题,自己 debug
jackzhan
2019-05-21 10:48:06 +08:00
@mezi04 指定 sql 得话,这个操作应该不行,多对多的话,产生的查询太多了
jackzhan
2019-05-21 10:53:17 +08:00
@mezi04 你之前碰到这种怎么解决的
jookr
2019-05-21 11:21:04 +08:00
表设计有问题,一个 id 一个角色。
关系是 m.role_id=mr.id
mezi04
2019-05-21 11:25:06 +08:00
@jackzhan #15 优先搞定你的产品经理,让 TA 接受这个。不行的话,方案 2。
airfling
2019-05-21 11:29:27 +08:00
一对多的问题,你的 resultMap 的结果集是 reduce 后的,你这样应该是封装对象的,而不是直接用 resultmap,会比较好理解一些
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
2019-05-21 13:20:00 +08:00
创建新回复过程中遇到一些问题:
请不要在每一个回复中都包括外链,这看起来像是在 spamming

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566096

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX