0

いくつかのオブジェクトが記述されているテーブルがあります。

id title   low middle high
-- ------- --- ------ ----
1  Object1   2      5   11
2  Object2   2      6   11
3  Object3   2      5   15
4  Object4   2      5   11
5  Object5   2      5   11
6  Object6   2      5   11
7  Object7   2      5   15

したがって、Object1 の値の場合、0 ~ 2 は lowCount として、3 ~ 5 は middleCount として、6 ~ 11 は highCount として、11 より大きいすべての値は overCount として計算する必要があります。

すべてのオブジェクトは 3 つの値を取得でき、低、中、高、および範囲外の値がいくつあるかをカウントする必要があります。

たとえば、値が1、4、12の場合、結果が得られると期待しています

id title   low middle high lowCount middleCount highCount overCount
-- ------- --- ------ ---- -------- ----------- --------- ---------
1  Object1   2      5   11        1           0         1         1
2  Object2   2      6   11        1           1         0         1
3  Object3   2      5   15        1           0         2         0
4  Object4   2      5   11        1           0         1         1
5  Object5   2      5   11        1           0         1         1
6  Object6   2      5   11        1           0         1         1
7  Object7   2      5   15        1           0         2         0

この問題では、次のクエリを使用します。

SELECT
    `st`.`id`, `st`.`title`, `st`.`low`, `st`.`middle`, `st`.`high`
    , (IF((1 >= 0 AND 1 <= `st`.`low`), 1, 0) + IF((4 >= 0 AND 4 <= `st`.`low`), 1, 0) + IF((12 >= 0 AND 12 <= `st`.`low`), 1, 0)) as `lowCount`
    , (IF((1 > `st`.`low` AND 1 <= `st`.`middle`), 1, 0) + IF((4 > `st`.`low` AND 4 <= `st`.`middle`), 1, 0) + IF((12 > `st`.`low` AND 12 <= `st`.`middle`), 1, 0)) as `middleCount`
    , (IF((1 > `st`.`middle` AND 1 <= `st`.`high`), 1, 0) + IF((4 > `st`.`middle` AND 4 <= `st`.`high`), 1, 0) + IF((12 > `st`.`middle` AND 12 <= `st`.`high`), 1, 0))  as `highCount`  
    , (IF((1 > `st`.`high`), 1, 0) + IF((4 > `st`.`high`), 1, 0) + IF((12 > `st`.`high`), 1, 0)) + 2  as `overCount`
FROM
    `some_table` `st`

私はこの構造が好きではありません

, (IF((1 >= 0 AND 1 <= `st`.`low`), 1, 0) + IF((4 >= 0 AND 4 <= `st`.`low`), 1, 0) + IF((12 >= 0 AND 12 <= `st`.`low`), 1, 0)) as `lowCount`

代わりに何が使えますか

4

1 に答える 1

2

if許容されます。caseステートメントは長くなりますが、標準 SQL です。ただし、MySQL では、次のこともできます。

select `st`.`id`, `st`.`title`, `st`.`low`, `st`.`middle`, `st`.`high`,
       ((1 >= 0 AND 1 <= `st`.`low`) + (4 >= 0 AND 4 <= `st`.`low`) + (12 >= 0 AND 12 <= `st`.`low`)) as `lowCount`,
       ((1 > `st`.`low` AND 1 <= `st`.`middle`) + (4 > `st`.`low` AND 4 <= `st`.`middle`) + (12 > `st`.`low` AND 12 <= `st`.`middle`)) as `middleCount`,
       ((1 > `st`.`middle` AND 1 <= `st`.`high`) + (4 > `st`.`middle` AND 4 <= `st`.`high`) + (12 > `st`.`middle` AND 12 <= `st`.`high`))  as `highCount` 
FROM `some_table` `st`;

つまり、MySQL は「true」を として1、「false」をとして扱う0ので、ブール値を加算するだけでカウントを取得できます。

于 2013-08-10T20:22:45.860 に答える