最近写分页遇到一个 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 限制只查两个学校,并且能查出学校下的所有专业?
4141 次点击
所在节点    程序员
32 条回复
reus
2019-07-16 23:39:56 +08:00
子查询啊……

select 专业
where 学校 in (
select 学校
limit 2
)
axwz88
2019-07-16 23:40:13 +08:00
不好意思呀,不常在 v 站发帖,编辑的时候排版好了的,然后发布后空格都被删除了,所以就有了上面看到的缩成一坨的排版
axwz88
2019-07-17 00:25:47 +08:00
@reus 这样不行的,虽然可以限制学校数量,但这样就不能用 where 条件筛选学校了
xiaowei0823
2019-07-17 00:35:47 +08:00
where 条件后面可以继续 and 吧
xaplux
2019-07-17 02:39:43 +08:00
单表查询在学校上分页,然后根据学校批量查询专业,在内存中填充到学校即可
ninjachen
2019-07-17 03:21:07 +08:00
感觉这个没法分页
yuikns
2019-07-17 03:51:12 +08:00
SELECT s.school_name, m.major_name
FROM major m
INNER JOIN (
SELECT sid, school_name
FROM school
WHERE sid < 10
LIMIT 2
) as s
ON s.sid=m.sid

这样?
yuikns
2019-07-17 04:02:59 +08:00
@yuikns https://www.db-fiddle.com/f/mEqnELA5rBV1n5RswchfAJ/2
突然找到一个有趣的工具。不过貌似不支持中文
liubian
2019-07-17 06:55:24 +08:00
SELECT s.school_name , GROUP_CONCAT(m.major_name) FROM school s LEFT JOIN major m ON s.sid= m.sid GROUP BY sid LIMIT 0,2
beginor
2019-07-17 07:16:22 +08:00
给个提示,用 row_number 来
dcty
2019-07-17 08:40:16 +08:00
需求拆分为:
1. 我需要限制查询学校的数量
2. 我需要根据 1 拿到的学校查询所有专业
程序能实现吧,不一定要在 SQL 上死磕。
Alexhohom
2019-07-17 08:55:12 +08:00
select * from tbla a inner join tblb b on a.sid= b.sid where sid in ( 1,2 )
限制只查两个学校不应该从 SQL 实现吧,应该在传进来的值作处理时判断。分页可以用 row_number 函数。
rocksolid
2019-07-17 08:56:31 +08:00
@axwz88 你 where 查询条件放在子查询里不就好了
brust
2019-07-17 09:01:53 +08:00
@yuikns #8 这个是干嘛的? 可以自动写 sql 吗
ganbuliao
2019-07-17 09:08:41 +08:00
你可以试试 group_concat 这个函数
vance
2019-07-17 09:10:47 +08:00
看不懂你要达到什么样的效果,限制 2 个学校不就直接 limit 学校就好了
ganbuliao
2019-07-17 09:11:42 +08:00
select school.sid,school.school_name,group_concat(major,major_name) from school left join major on school.sid = major.sid group by school.sid limit 2
应该可以
kaneg
2019-07-17 09:19:04 +08:00
select school_name,major_name from school s,major m where s.sid=m.sid and s.id in (select sid from school limit 2 offset <分页偏移量>)

分页条件加在学校的子查询即可
qiayue
2019-07-17 09:19:41 +08:00
现在硬盘不值钱了,所以骚年,去冗余数据吧
按照你要查询出来的结果去设计一张最终结果表格,然后给次更新数据时维护好这张结果表,然后每次查询时,直接从结果表查询,想要分页,啥都有
Aruforce
2019-07-17 09:41:51 +08:00
```SQL
select * from major m , (select * from school limit 0,2) s where m.sid = s.sid

```

这样?

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

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

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

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

© 2021 V2EX