我有两个表: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 作为下限。
如何实现这一目标?
最佳答案
您可以将 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 .
关于mysql - 根据存储在另一个表中的重量范围查找记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197040/