2013-08-10 3 views
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, как переучет.

Каждый объект может получить 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` 

Что я мог использовать вместо

+0

Рассмотрите возможность создания sqlfiddle – Strawberry

ответ

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 трактует «истинный», как 1 и «ложь», как 0, так что вы можете просто сложить булевы значения, чтобы получить отсчеты.

Смежные вопросы