У меня есть таблица, где описаны некоторые объекты.Вычислить значения в диапазонах для каждой строки в таблице
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, как переучет.
Каждый объект может получить 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`
Что я мог использовать вместо
Рассмотрите возможность создания sqlfiddle – Strawberry