2013-11-21 2 views
0

Я использую базу данных MySQL, которая имеет столбец «Персонал». Пример:Как суммировать записи в базе данных

ID BUSINESS STAFF 
1  Business 1 Bob 
2  Business 2 Bill 
3  Business 3 Paul, Bill 
4  Business 4 Bob 

Я с целью создать круговую диаграмму, показывающую, как многие предприятия каждый член персонала имеет, используя Charts API Google, и у меня возникают проблемы подсчета общей суммы.

Диаграмма использует форматирование:

var data = google.visualization.arrayToDataTable([ 
['Staff', 'Business'], 
['Bob',  2], 
['Bill',  2], 
['Paul',  1] 
]); 

Как бы я идти о повторив количество этих строк? Я потратил 40 минут на беспорядки с запросами COUNT, без всякой радости.

+5

1. Нормализовать данные – Strawberry

+1

вам необходимо разделить ваши данные на 2, то есть: нормализация данных, одна таблица для предприятий и одна таблица для персонала и одна таблица для ссылки на 2 вместе. – Dave

+0

Измените таблицу на столбе «STAFF' и вариант для вас? –

ответ

1

Существует общая тема в комментариях здесь, и это normalization. Как правило, A Bad Thing представляет несколько значений в виде списка, разделенного запятыми, в одном столбце.

Вот рабочий пример альтернативного DB дизайна, который должен получить вы идете в правильном направлении:

create table staff 
(
id int unsigned not null primary key auto_increment, 
staffName varchar(250), 
unique key `staffUIdx1` (staffName) 
) ENGINE=InnoDB; 

create table business 
(
id int unsigned not null primary key auto_increment, 
businessName varchar(250), 
unique key `staffUIdx1` (businessName) 
) ENGINE=InnoDB; 

CREATE TABLE staffBusiness 
(
id int unsigned not null primary key auto_increment, 
staffId int unsigned not null, 
businessId int unsigned not null, 
unique key `staffBusinessUIdx1` (staffId,businessId), 
CONSTRAINT `fk_staffBusiness_staff1` FOREIGN KEY (`staffId`) REFERENCES `staff` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
CONSTRAINT `fk_staffBusiness_business1` FOREIGN KEY (`businessId`) REFERENCES `business` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB; 

insert into staff (staffName) values ('Bob'); 
insert into staff (staffName) values ('Bill'); 
insert into staff (staffName) values ('Paul'); 
insert into staff (staffName) values ('George'); 


insert into business (businessName) values ('Business 1'); 
insert into business (businessName) values ('Business 2'); 
insert into business (businessName) values ('Business 3'); 
insert into business (businessName) values ('Business 4'); 

insert into staffBusiness (staffId,businessId) 
select s.id,b.id from staff s join business b 
where s.staffName = 'Bob' and b.businessName in ('Business 1','Business 4'); 

insert into staffBusiness (staffId,businessId) 
select s.id,b.id from staff s join business b 
where s.staffName = 'Bill' and b.businessName in ('Business 2','Business 3'); 

insert into staffBusiness (staffId,businessId) 
select s.id,b.id from staff s join business b 
where s.staffName = 'Paul' and b.businessName in ('Business 3'); 

... и тогда запрос будет выглядеть следующим образом:

select staffName as Staff,count(sb.id) as Business 
from staff s 
left outer join staffBusiness sb on s.id = sb.staffId 
group by staffName; 

Я включил 4-го сотрудника штата под названием «Джордж», чтобы показать, что нормализованный подход позволяет вам иметь сотрудников, не имеющих бизнеса.

+0

Спасибо, это выглядит невероятно полезным. – Dabien

1

Я разрабатываю этот код в соответствии ваш вопрос, вы должны изменить в соответствии вашей таблица и поле также изменить имя сервера конфигурации сервера, имя пользователя, пароль, базу данных

$server="server"; 
    $user="user"; 
    $password="password"; 
    $database="database"; 
    $cid=mysql_connect($server,$user,$password); 
    mysql_select_db($database,$cid); 
    $query="select * from table"; 
    $rs=mysql_query($query,$conn); 
    $val=0; 
    while($row=mysql_fetch_array($rs)) 
    { 
    $data=$row['business']; 
    $val=$val+trim(str_replace("Business","", "$data")); 
    } 
    $total=$val; 

Я использовал этот код и я нашел общий;

+1

Столбец 'STAFF' имеет более 1 значения с разделенной запятой. это ключевой момент. поэтому другие предлагают «НОРМАЛИЗАЦИЯ» –

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