我有两个表:fighters
和weight_divisions
。我的weight_divisons
表看起来像这样:
id | name | upper_limit
====================================
1 | Flyweight | 125
2 | Bantamweight | 135
3 | Featherweight | 145
4 | Lightweight | 155
5 | Welterweight | 170
6 | Middleweight | 185
7 | Light Heavyweight | 205
8 | Heavyweight | 265
然后我的fighters
表看起来像这样:
id | name | weight
===========================
1 | Rob Sinclair | 155
2 | Mark Adams | 145
3 | Jack Marshamn | 185
我想要做的是通过传递重量类别的ID来选择战士。我有一个查询选择 类别上限的所有战士......
SELECT
*
FROM
`fighters`
WHERE
`weight` <= (
SELECT
`upper_limit`
FROM
`weight_divisions`
WHERE
`id` = :weight_division
)
ORDER BY
`name` ASC
...但是,我还想使用下一个最低权重类别的上限作为下限。
例如,如果我指定4
(轻量级),则应选择155或以下的所有战士,但也应超过145(羽量级upper_limit
,羽量级是下一个最低的重量级别。在Flyweight的情况下,使用0作为下限。
我如何实现这一目标?
答案 0 :(得分:2)
您可以将weight_divisions
表自行加入到自身中,条件是联接的一侧比另一侧低upper_limit
,另一侧加入另一侧并选择连接下侧的MAX(upper_limit)
以获得每个分区的下限和上限。
然后只需要将结果与fighters
表连接并适当过滤:
SELECT fighters.*
FROM fighters
JOIN (
SELECT IFNULL(MAX(l.upper_limit),0) AS lower_limit, u.upper_limit
FROM weight_divisions l
RIGHT JOIN weight_divisions u ON l.upper_limit < u.upper_limit
WHERE u.id = 4
) w ON w.lower_limit <= fighters.weight AND fighters.weight < w.upper_limit
在sqlfiddle上查看。