0

と の 2 つのテーブルが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 を渡して戦闘機を選択することです。カテゴリの上限を下回るすべての選手を選択する 1 つのクエリがありました…</ 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、フェザー級は次に低い階級です)。Flyweight の場合、下限として 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 に答える