最近写分页遇到一个 limit 的小问题,一直想不通 SQL 怎么写

2019-07-16 23:37:22 +08:00
 axwz88
学校表:school
sid school_name
1 北京大学
2 清华大学
3 南京大学


专业表:major
mid major_name sid
1 专业 1 1
2 专业 2 1
3 专业 3 2
4 专业 4 2
5 专业 5 3
6 专业 6 3


查询语句:select school_name,major_name from school s,major m where s.sid=m.sid

查询结果:
school_name major_name
北京大学 专业 1
北京大学 专业 2
清华大学 专业 3
清华大学 专业 4
南京大学 专业 5
南京大学 专业 6

问题:怎样可以用 limit 限制只查两个学校,并且能查出学校下的所有专业?
4158 次点击
所在节点    程序员
32 条回复
Aruforce
2019-07-17 09:52:11 +08:00
@yuikns 这个工具不错啊
4tograph
2019-07-17 10:16:07 +08:00
select a.school_name,b.major_name
from school a
left join major b
where a.sid in (select sid from school group by sid limit 2) 这样对吗?
4tograph
2019-07-17 10:17:44 +08:00
@4tograph
不好意思 ,on 条件忘记写了 。
select a.school_name,b.major_name
from school a
left join major b on a.sid=b.sid
where a.sid in (select sid from school group by sid limit 2)
congeec
2019-07-17 11:39:23 +08:00
# 正解

类似问题都可以用 window function 解决
sunny2580839896
2019-07-17 14:02:43 +08:00
@reus #1 为啥我这样的报错的呀??? mysql 版本是 5.6 的
leo108
2019-07-17 14:08:01 +08:00
为什么不用两条 SQL 解决?曾经我也想一条 SQL 搞定所有问题,后来发现这个带来的所谓性能在可读性和可扩展性面前毫无价值。
meetocean
2019-07-17 14:32:16 +08:00
假设自己终于看懂了楼主所说分页面的意思,等会把答案发上来。
meetocean
2019-07-17 15:01:45 +08:00
问题已经解决!

测试数据库:mysql 5.7

## 查询

查询语句:

select * from  (select * from school limit 0,2) s,major m where s.sid=m.sid;


查询结果:

school_name   major_name

北京大学    专业 1

北京大学    专业 2

清华大学    专业 3

清华大学    专业 4



查询语句 2:

select * from  (select * from school limit 2,4) s,major m where s.sid=m.sid;

查询结果 2:

school_name   major_name

南京大学    专业 5

南京大学    专业 6


## 程序实现:

如果在程序中实现, limit 后面的数字改为变量名。

count_per_page = 2;

第一页:
page = 1;
offset = (page - 1) * count_per_page;

limit offset, count_per_page

第二页
page = 2;
offset = (page - 1) * count_per_page;

limit offset, count_per_page
meetocean
2019-07-17 15:03:59 +08:00
查询语句 2 代码 limit 2,4 改为 limit 2,2

select * from (select * from school limit 2,2) s,major m where s.sid=m.sid;
axwz88
2019-07-17 18:03:13 +08:00
谢谢大家的解答,每条回复我都认真的看了的,V 站的朋友们真的很用心。
解释一下我的问题,简单的说就是学校和专业两张表关联查询,然后专业表和学校表都有其他的属性,上面的举例是为了让问题更容易讲清楚所以简化了,实际的查询可能是这样的:

select s.school_name,m.major_name from school s,major m where s.sid=m.sid and m.专业类型="工科专业" and s.学校类型="工科院校"

这样就会查出很多符合条件的学校和该学校下符合条件的专业,每个学校下面的专业都不相同,我的需求是做分页,每页限制 20 个学校,把满足条件的学校和该学校下满足条件的专业显示出来,分页是限制每页 20 个学校,但不限制专业。大概意思就是这样。
axwz88
2019-07-17 18:06:43 +08:00
我晚上回去会把大家解答的实验一下,不管能不能达到最终效果都感谢大家的回复。
axwz88
2019-07-18 00:08:48 +08:00
经过试验,下面的 SQL 语句可以完美解决问题,一开始是我没把问题表达清楚...

SELECT s.school_name,m.major_name FROM major m inner join (select * from school where 学校类型="工科院校" LIMIT 0,20) s on s.sid = m.sid where m.专业类型="工科专业"

对[学校分页] 每页 20 个学校, 查出来的该学校的专业行数不限

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

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

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

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

© 2021 V2EX