【发布时间】:2017-05-26 19:27:40
【问题描述】:
为了举例,假设我有以下模型:
- 团队
- 每支球队都有任意数量的球迷
在 SQL 中,这意味着您最终会得到以下表格:
- 团队:标识符、名称
- 粉丝:标识符、名称
- team_fan: team_identifier, fan_identifier
我正在寻找一种检索方法:
- 所有团队,以及
- 对于每支球队,前 5 名球迷的名字以“A”开头。
什么是有效的方法?
-
在我目前的幼稚方法中,我做
<# teams> + 1查询,这很麻烦:- 第一:
SELECT * FROM team -
然后,对于标识符为
X的每个团队:SELECT * FROM fan INNER JOIN team_fan ON fan.identifier = team_fan.fan_identifier AND team_fan.team_identifier = X WHERE fan.name LIKE 'A%' ORDER BY fan.name LIMIT 5
- 第一:
应该有更好的方法来做到这一点。
我可以像现在一样首先检索所有团队,然后执行以下操作:
SELECT *
FROM fan
WHERE fan.name LIKE 'A%'
AND fan.identifier IN (
SELECT fan_identifier
FROM team_fan
WHERE team_identifier IN (<all team identifiers from first query>))
ORDER BY fan.name
但是,这种方法忽略了我需要每支球队的前 5 名球迷的要求,他/她的名字以“A”开头。只是在上面的查询中添加LIMIT 5 是不正确的。
另外,使用这种方法,如果我有大量团队,我会在第二个查询中将相应的团队标识符发送回数据库(对于IN (<all team identifiers from first query>)),这可能会影响性能吗?
我正在针对 PostgreSQL、Java、Spring 和普通 JDBC 进行开发。
【问题讨论】:
-
如果某些球队的名字以 A 开头的球迷少于五个怎么办?您不想按字母顺序排列前五个粉丝吗?
-
Mick:不,我希望每支球队的前 5 名球迷的名字以
A开头。如果一个团队没有这样的 5 个粉丝,那么这个粉丝列表会更小。
标签: sql postgresql