根据存储在另一个表中的重量范围查找记录

时间:2012-08-30 12:38:47

标签: mysql database relational-database

我有两个表:fightersweight_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作为下限。

我如何实现这一目标?

1 个答案:

答案 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上查看。