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

标签 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 作为下限。

如何实现这一目标?

最佳答案

您可以将 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/

相关文章:

c++ - DBExpress和mysql最后插入id

mysql - Rails 十进制迁移生成整数列

asp.net - 在 asp.net 中连接 Flash 编程 SWF 文件并需要在数据中存储一些值

mysql - 设计电子商务数据库 - MySQL

mysql - 构建gwas阵列数据库

mysql - 链接到一对多表的一对多表

python - 在没有标点符号或空格的 Django 模型中查找匹配项

python - 如何为我的 P2P 租赁市场建立数据库?

sql-server - 在多个数据库服务器上执行并行查询(运行 Microsoft SQL Server)

mysql - SQL:从多个表中查询相关数据