0

我有两张桌子: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 来选择战士。我有一个查询,它选择了一个类别上限 以下的所有战士……</p>

SELECT
    *
FROM
    `fighters`
WHERE
    `weight` <= (
        SELECT
            `upper_limit`
        FROM
            `weight_divisions`
        WHERE
            `id` = :weight_division
    )
ORDER BY
    `name` ASC

…但是,我也想使用下一个最低重量类别的上限作为下限。

例如,如果我指定4(轻量级),它应该选择所有 155 岁或以下,但也超过 145 岁的拳手(羽量级upper_limit,羽量级是次低重量级)。在享元的情况下,使用 0 作为下限。

我如何实现这一目标?

4

1 回答 1

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

于 2012-08-30T12:47:31.733 回答