2013-12-02 4 views
0

У меня есть следующая таблица, и я пытаюсь подсчитать значения из столбцов 'name' и 'name2', но только добавьте половину значений count, если 'name2'! = Null , А также создайте еще один столбец, как и раньше, где он также проверяет «активное» значение.MySQL COUNT() + половина секунды COUNT

Например, мой стол

ID | Name1 | Name2 | Active 
------------------------------ 
1 | John |  | True 
2 | Mike | John | True 
3 | Tim |  | False 
4 | Tim | Burt | False 

И результат, я пытаюсь создать

Names | Split_Count | Active_Count 
Burt |  0.5  | 0 
John |  1.5  | 1.5 
Mike |  0.5  | 0.5 
Tim |  1.5  | 0 

До сих пор я был в состоянии рассчитывать только в целых числах, так бы я лучше делать это в PHP?

Вся помощь очень ценится.

РЕДАКТИРОВАТЬ: для пояснения запрос будет ++ 1 для имени, но если в строке есть 2 имени, то +0.5 для каждого имени.

Где как, Active_Count будет делать то же, что и выше, где ACTIVE = TRUE.

+0

Что вы хотите сделать? – DanFromGermany

+2

Можете ли вы объяснить свою логику более подробно? У Burt есть 0,5 в Split, потому что каждый раз, когда он появляется в столбце Name2, он получает 0,5? Приравнивается ли Джон к 1,5, потому что 1 для Name1 (запись 1) и 0,5 для Name2 в записи №2? Разве Тим не будет 2, потому что он находится в Name1 для записей 3 и 4? Почему Mike 0.5 и не 1.0? – AgRizzo

ответ

0

Я думаю, что понимаю, что вы после. Дайте это:

create table person 
(
id int unsigned not null primary key auto_increment, 
Name1 varchar(50) default null, 
Name2 varchar(50) default null, 
Active varchar(50) not null default 'True' 
); 

insert into person (Name1,Name2,Active) values ('John',null,'True'); 
insert into person (Name1,Name2,Active) values ('Mike','John','True'); 
insert into person (Name1,Name2,Active) values ('Tim',null,'False'); 
insert into person (Name1,Name2,Active) values ('Tim','Burt','False'); 

select person as Names, 
sum(splitScore) as Split_Count, 
sum(activeScore) as Active_Count 
from 
(
select Name1 as person, 
case when Name2 is null then 1 else 0.5 end as splitScore, 
case when Active='True' and Name2 is null then 1 when Active='True' and Name2 is not null then 0.5 else 0 end as activeScore 
from person where Name1 is not null 
union all 
select Name2 as person, 
case when Name1 is null then 1 else 0.5 end as splitScore, 
case when Active='True' and Name1 is null then 1 when Active='True' and Name1 is not null then 0.5 else 0 end as activeScore 
from person where Name2 is not null 
) t 
group by person 
; 
+0

Спасибо. Прекрасно работает. Быстро вопрос, возможно ли ВНУТРИ ПРИСОЕДИНЕНИЕ с другой таблицей? Я попытался присоединиться к псевдониму, но я делаю что-то неправильно. – Ash

+0

Несомненно. После ') t' вы бы сделали что-то вроде:') t inner join someOtherTable s on s.names = t.person' –

+0

Извините, что спросить еще раз, я хочу также добавить предложение WHERE date = после JOIN. «Неизвестный столбец» - это ошибка, даже если я добавляю или удаляю псевдоним Date. Спасибо за помощь. – Ash