|
|
|
| Есть три таблицы.
Таблица № 1 - Кварталы (quarter_table)
|---id---|------q1_s------|-------q1_e--------|--------q2_s-------|--------q2_e-------|-------q3_s--------|--------q3_e----|
|---1----|-2008-01-01--|---2008-01-31---|---2008-02-01---|---2008-02-28---|---2008-03-01---|---2008-03-31---|
Таблица № 2 - Список юзеров (op_table)
|---id---|-------fio-------|----namber---|---login---|
|---1----|---Иванов----|-------5--------|----ivan----|
|---2----|---Петров----|-------5--------|----petr----|
Таблица № 3 - Таблица параметров юзера (control_table )
|---id_с---|---id_op---|------date----------|---go1---|---go2---|---go3---|---n1---|---n2---|---n3---|
|---1-------|-------1-----|---2008-03-05---|---1------|-------2---|------5---|---0-----|-----2---|-----1---|
|---2-------|-------1-----|---2008-02-05---|---1------|-------0---|------5---|---0-----|-----2---|-----0---|
|---3-------|-------2-----|---2008-01-05---|---1------|-------2---|------5---|---0-----|-----2---|-----1---|
|---4-------|-------2-----|---2008-04-05---|---1------|-------0---|------5---|---0-----|-----2---|-----0---|
Вторая и третья таблици связаны: Таблица 2 поле id = таблица 3 поле id_op
Необходимо:
Объеденить таблици с группировкой по "id_op" из таблицы 2 и суммарными значениями отдельно всех полей go и полей n + выборка по кварталам из таблицы 1 со зачением поля date из таблицы 3.
Сейчас запрос такой:
$d = "SELECT * FROM quarter_table where CURDATE() >= start_q AND CURDATE() <= end_q";
$res = mysql_query($d);
$row = mysql_fetch_row($res);
$list = "SELECT fio,
id_c,
date,
SUM(`go1`) + SUM(`go2`) + SUM(`go3`) AS `sum_go`,
SUM(`n1`) + SUM(`n2`) + SUM(`n3`) AS `sum_n`
FROM op_table LEFT JOIN control_table ON op_table.id=control_table.id_op
WHERE date_audit >= '$row[2]' AND date_audit <= $row[3]
GROUP BY id_op";
|
Как сделать вывод таблички такого типа из объединения запросов или другим способом:
|-----ФИО-----|-----Январь-----|-----Февраль-----|-----Март---------|-----Квартал---------|
|---Иванов---|------Сумма1----|-----Сумма2------|----Сумма3-----|--Сумма квартал--|
Сумма = сумма всех столбцов go и n с группировкой по id_op
Январь = от q1_s до q1_s
Февраль = от q2_s до q2_s
Март = от q3_s до q3_s | |
|
|
|
|
|
|
|
для: maxfade
(09.06.2008 в 13:55)
| | Неужели нет мыслей ? | |
|
|
|
|
|
|
|
для: maxfade
(10.06.2008 в 16:23)
| | А что содержат столбцы go1, go2, go3, n1, n2, n3? | |
|
|
|
|
|
|
|
для: olejek
(10.06.2008 в 17:15)
| | там только цифры, т.е. мне надо сложить цифры по месяцам, их вывести и спосле этого сложить за квартал.... Затем сделать сумму значений в столбцах и вывести внизу таблицы...
Примерно так:
|----------------------ФИО---|--Апрель---|----Май----|----Июнь---|----За квартал----|
|------------------Иванов---|------15------|------5------|------1-------|----------21----------|
|------------------Петров---|------5--------|------3------|------7-------|----------15----------|
|---Общее за квартал---|------20------|------8------|------8-------|----------36----------|
Как это проще организовать с меньшим количеством запросов? | |
|
|
|
|
|
|
|
для: maxfade
(11.06.2008 в 10:05)
| | Да, трудно, конечно, вас понять. Я спрашивал, что содержат столбцы go1, n1..., а вы пишите "там только цифры" - это я и так вижу. Я имел ввиду их назначение.
А таблица quarter_table вообще не понятно для чего нужна. Похоже, что она хранит начало и конец месяца, но это и так можно узнать.
Я к тому, что структура базы данных, по-моему, не хорошо продумана. Лучше потратить много времени на построение базы данных, зато потом сэкономить массу времени на построении запросов. | |
|
|
|
|
|
|
|
для: olejek
(11.06.2008 в 10:54)
| | go - грубая ошибка, о - ошибка, н - недочет.
Необходимы для сбора статистики по количеству ошибок....
Как раз необходимо подсчитать сумму этих ошибок по месяцам отдельно + сумму за квартал
Также сумму по месяцам общую по все ФИО и сумму за квартал по ним.
На данный момент смог вывести значения по месяцам и суммарно за квартал, правдо потребовалось три запроса.
Как посчитать по всем сотрудникам оп месяцам и суммарно за квартал?
Можно конечно сделать еще три запроса, но думаю, это слишком большая нагрузка на базу...
Мой запрос:
$d = "SELECT * FROM quarter_table where CURDATE() >= start_q AND CURDATE() <= end_q";
$res = mysql_query($d);
$row = mysql_fetch_row($res);
// WHERE date_audit >= '$row[13]' AND date_audit <= '$row[14]'
echo "<table align=center width=100% border=0 cellspacing=2 cellpadding=2>
<tr>
<td class='table_gtt width='40%'>ФИО</td>
<td class='table_gtt width='15%'>".$row[5]."</td>
<td class='table_gtt width='150%'>".$row[6]."</td>
<td class='table_gtt width='15%'>".$row[7]."</td>
<td class='table_gtt width='15%'>Квартал</td>
</tr>";
$sql = "SELECT fio,
id_control,
date_audit,
SUM(`go1`) + SUM(`go2`) + SUM(`go3`) + SUM(`go4`) + SUM(`go5`) + SUM(`go6`) + SUM(`go7`) + SUM(`go8`) + SUM(`go9`) + SUM(`go10`) AS `sum_go1`,
SUM(`o1`) + SUM(`o2`) + SUM(`o3`) + SUM(`o4`) + SUM(`o5`) + SUM(`o6`) + SUM(`o7`) + SUM(`o8`) + SUM(`o9`) + SUM(`o10`) AS `sum_o1`,
SUM(`n1`) + SUM(`n2`) + SUM(`n3`) + SUM(`n4`) + SUM(`n5`) + SUM(`n6`) + SUM(`n7`) + SUM(`n8`) + SUM(`n9`) + SUM(`n10`) AS `sum_n1`
FROM op_table LEFT JOIN control_table ON op_table.id=control_table.id_op
WHERE date_audit >= '$row[8]' AND date_audit <= '$row[9]'
GROUP BY id_op";
$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}
if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}
// До тех пор, пока в результате содержатся ряды, помещаем их в
// ассоциативный массив.
// Заметка: если запрос возвращает только один ряд -- нет нужды в цикле.
// Заметка: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname, $userstatus.
$sql2 = "SELECT fio,
id_control,
date_audit,
SUM(`go1`) + SUM(`go2`) + SUM(`go3`) + SUM(`go4`) + SUM(`go5`) + SUM(`go6`) + SUM(`go7`) + SUM(`go8`) + SUM(`go9`) + SUM(`go10`) AS `sum_go2`,
SUM(`o1`) + SUM(`o2`) + SUM(`o3`) + SUM(`o4`) + SUM(`o5`) + SUM(`o6`) + SUM(`o7`) + SUM(`o8`) + SUM(`o9`) + SUM(`o10`) AS `sum_o2`,
SUM(`n1`) + SUM(`n2`) + SUM(`n3`) + SUM(`n4`) + SUM(`n5`) + SUM(`n6`) + SUM(`n7`) + SUM(`n8`) + SUM(`n9`) + SUM(`n10`) AS `sum_n2`
FROM op_table LEFT JOIN control_table ON op_table.id=control_table.id_op
WHERE date_audit >= '$row[10]' AND date_audit <= '$row[11]'
GROUP BY id_op";
$result2 = mysql_query($sql2);
if (!$result2) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}
if (mysql_num_rows($result2) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}
// До тех пор, пока в результате содержатся ряды, помещаем их в
// ассоциативный массив.
// Заметка: если запрос возвращает только один ряд -- нет нужды в цикле.
// Заметка: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname, $userstatus.
$sql3 = "SELECT fio,
id_control,
date_audit,
SUM(`go1`) + SUM(`go2`) + SUM(`go3`) + SUM(`go4`) + SUM(`go5`) + SUM(`go6`) + SUM(`go7`) + SUM(`go8`) + SUM(`go9`) + SUM(`go10`) AS `sum_go3`,
SUM(`o1`) + SUM(`o2`) + SUM(`o3`) + SUM(`o4`) + SUM(`o5`) + SUM(`o6`) + SUM(`o7`) + SUM(`o8`) + SUM(`o9`) + SUM(`o10`) AS `sum_o3`,
SUM(`n1`) + SUM(`n2`) + SUM(`n3`) + SUM(`n4`) + SUM(`n5`) + SUM(`n6`) + SUM(`n7`) + SUM(`n8`) + SUM(`n9`) + SUM(`n10`) AS `sum_n3`
FROM op_table LEFT JOIN control_table ON op_table.id=control_table.id_op
WHERE date_audit >= '$row[12]' AND date_audit <= '$row[13]'
GROUP BY id_op";
$result3 = mysql_query($sql3);
if (!$result3) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}
if (mysql_num_rows($result3) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}
// До тех пор, пока в результате содержатся ряды, помещаем их в
// ассоциативный массив.
// Заметка: если запрос возвращает только один ряд -- нет нужды в цикле.
// Заметка: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname, $userstatus.
while ($r = mysql_fetch_assoc($result) AND $r2 = mysql_fetch_assoc($result2) AND $r3 = mysql_fetch_assoc($result3))
{
extract($r);
extract($r2);
extract($r3);
$s_m1 = (1 - ($sum_go1*0.3 + $sum_o1*0.15 + $sum_n1*0.05));
$s_m2 = (1 - ($sum_go2*0.3 + $sum_o2*0.15 + $sum_n2*0.05));
$s_m3 = (1 - ($sum_go3*0.3 + $sum_o3*0.15 + $sum_n3*0.05));
if ($s_m1 < 0) $summ_m1 = "0"; else $summ_m1 = $s_m1;
if ($s_m2 < 0) $summ_m2 = "0"; else $summ_m2 = $s_m2;
if ($s_m3 < 0) $summ_m3 = "0"; else $summ_m3 = $s_m3;
$s_kv = ($summ_m1 + $summ_m2 + $summ_m3)/3;
echo "<tr>
<td align='left' width='40%'>".$fio."</td>
<td align='center' width='15%'>".$summ_m1."</td>
<td align='center' width='15%'>".$summ_m2."</td>
<td align='center' width='15%'>".$summ_m3."</td>
<td align='center' width='15%'>".$s_kv."</td>
</tr>";
}
mysql_free_result($result);
mysql_free_result($result2);
mysql_free_result($result3);
"</table>";
|
Таблица quarter_table
CREATE TABLE `quarter_table` (
`id_q` int(11) NOT NULL AUTO_INCREMENT,
`simvol` varchar(128) NOT NULL,
`name` varchar(125) NOT NULL,
`start_q` date NOT NULL,
`end_q` date NOT NULL,
`month1` varchar(32) NOT NULL,
`month2` varchar(32) NOT NULL,
`month3` varchar(32) NOT NULL,
`month1_start` date NOT NULL,
`month1_end` date NOT NULL,
`month2_start` date NOT NULL,
`month2_end` date NOT NULL,
`month3_start` date NOT NULL,
`month3_end` date NOT NULL,
PRIMARY KEY (`id_q`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;
|
Таблица op_table
CREATE TABLE `op_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fio` varchar(128) NOT NULL,
`otdel` char(12) NOT NULL,
`status` char(32) NOT NULL,
`namber` char(4) NOT NULL,
`login` varchar(128) NOT NULL,
`group` char(32) NOT NULL,
`hide` enum('show','hide') NOT NULL DEFAULT 'show',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
|
Таблица control_table
CREATE TABLE `control_table` (
`id_control` int(11) NOT NULL AUTO_INCREMENT,
`id_op` char(64) NOT NULL,
`otdel` varchar(32) NOT NULL,
`group_op` varchar(32) NOT NULL,
`auditor` varchar(128) NOT NULL,
`date_audit` date DEFAULT NULL,
`cisco` char(15) NOT NULL,
`take` enum('Yes','No') NOT NULL DEFAULT 'No',
`enable` enum('Yes','No') NOT NULL DEFAULT 'No',
`date1` date DEFAULT NULL,
`date2` date DEFAULT NULL,
`date3` date DEFAULT NULL,
`date4` date DEFAULT NULL,
`date5` date DEFAULT NULL,
`date6` date DEFAULT NULL,
`date7` date DEFAULT NULL,
`date8` date DEFAULT NULL,
`date9` date DEFAULT NULL,
`date10` date DEFAULT NULL,
`time1` varchar(5) NOT NULL,
`time2` varchar(5) NOT NULL,
`time3` varchar(5) NOT NULL,
`time4` varchar(5) NOT NULL,
`time5` varchar(5) NOT NULL,
`time6` varchar(5) NOT NULL,
`time7` varchar(5) NOT NULL,
`time8` varchar(5) NOT NULL,
`time9` varchar(5) NOT NULL,
`time10` varchar(5) NOT NULL,
`theme1` varchar(256) NOT NULL,
`theme2` varchar(256) NOT NULL,
`theme3` varchar(256) NOT NULL,
`theme4` varchar(256) NOT NULL,
`theme5` varchar(256) NOT NULL,
`theme6` varchar(256) NOT NULL,
`theme7` varchar(256) NOT NULL,
`theme8` varchar(256) NOT NULL,
`theme9` varchar(256) NOT NULL,
`theme10` varchar(256) NOT NULL,
`go1` varchar(3) NOT NULL,
`go2` varchar(3) NOT NULL,
`go3` varchar(3) NOT NULL,
`go4` varchar(3) NOT NULL,
`go5` varchar(3) NOT NULL,
`go6` varchar(3) NOT NULL,
`go7` varchar(3) NOT NULL,
`go8` varchar(3) NOT NULL,
`go9` varchar(3) NOT NULL,
`go10` varchar(3) NOT NULL,
`o1` varchar(3) NOT NULL,
`o2` varchar(3) NOT NULL,
`o3` varchar(3) NOT NULL,
`o4` varchar(3) NOT NULL,
`o5` varchar(3) NOT NULL,
`o6` varchar(3) NOT NULL,
`o7` varchar(3) NOT NULL,
`o8` varchar(3) NOT NULL,
`o9` varchar(3) NOT NULL,
`o10` varchar(3) NOT NULL,
`n1` varchar(3) NOT NULL,
`n2` varchar(3) NOT NULL,
`n3` varchar(3) NOT NULL,
`n4` varchar(3) NOT NULL,
`n5` varchar(3) NOT NULL,
`n6` varchar(3) NOT NULL,
`n7` varchar(3) NOT NULL,
`n8` varchar(3) NOT NULL,
`n9` varchar(3) NOT NULL,
`n10` varchar(3) NOT NULL,
`coment1` text NOT NULL,
`coment2` text NOT NULL,
`coment3` text NOT NULL,
`coment4` text NOT NULL,
`coment5` text NOT NULL,
`coment6` text NOT NULL,
`coment7` text NOT NULL,
`coment8` text NOT NULL,
`coment9` text NOT NULL,
`coment10` text NOT NULL,
`duration1` varchar(8) NOT NULL,
`duration2` varchar(8) NOT NULL,
`duration3` varchar(8) NOT NULL,
`duration4` varchar(8) NOT NULL,
`duration5` varchar(8) NOT NULL,
`duration6` varchar(8) NOT NULL,
`duration7` varchar(8) NOT NULL,
`duration8` varchar(8) NOT NULL,
`duration9` varchar(8) NOT NULL,
`duration10` varchar(8) NOT NULL,
`class1` varchar(128) NOT NULL,
`class2` varchar(128) NOT NULL,
`class3` varchar(128) NOT NULL,
`class4` varchar(128) NOT NULL,
`class5` varchar(128) NOT NULL,
`class6` varchar(128) NOT NULL,
`class7` varchar(128) NOT NULL,
`class8` varchar(128) NOT NULL,
`class9` varchar(128) NOT NULL,
`class10` varchar(128) NOT NULL,
PRIMARY KEY (`id_control`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;
|
| |
|
|
|
|
|
|
|
для: maxfade
(11.06.2008 в 12:08)
| | Заранее прошу прощения, может я не прав, но на мой взгляд просто ужа-а-асная структура базы данных, особенно таблицы control_table.
Сейчас у вас где-то 10 категорий (date, time, theme, duratin, class...) по 10. А если будет по 100, Вы тоже будете создавать 100 х 10 полей. Вы не сможете работать с такой таблицей, а построение запросов будет вызывать массу трудностей.
Еще раз предлагаю хорошо продумать структуру базы данных. Вот смотрите для примера, если бы таблица control_table имела такую структуру:
CREATE TABLE `control_table` (
`id_control` int(11) NOT NULL AUTO_INCREMENT,
`id_op` char(64) NOT NULL,
`error` enum('go','o','n') default NULL,
`er_date` date NOT NULL,
PRIMARY KEY (`id_control`),
KEY `id_user` (`id_user`),
CONSTRAINT `control_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) ON DELETE CASCADE
) ENGINE=InnoDB
|
то того, чего вы хотите добиться можно добиться в два шага:
1) запрос:
SELECT count( * ) , fio, error, MONTH( `date` ) AS m
FROM op_table, control_table
WHERE op_table.id_op = control_table.id_op
GROUP BY m, error, user
ORDER BY user, m
|
который возвратит, например, такой результат:
count( * ) user error m
1 Ivan go 5
1 Ivan o 5
1 Ivan o 6
1 Ivan n 6
4 Ivan go 6
2 Petr go 6
|
2) код php, который отобразит это в том виде, который вы хотите.
Но это один из вариантов, есть много других. | |
|
|
|
|
|
|
|
для: olejek
(11.06.2008 в 14:57)
| | я об этом уже думал, но проблема в том, что допустим в одной проверке сотрудника может быть несколько go, о и n, причем необходимо обязательно записать коментарий по каждой ошибке. + еще много параметров по ней, которые отображены в 'control_table'.
Может есть другой вариант постраения таблиц, необходимый для данной задачи?
Но только с возможность подробного описания каждой проверки... | |
|
|
|
|
|
|
|
для: maxfade
(11.06.2008 в 21:55)
| | Если я правильно понял постановку вашей задачи, то таблица должна выглядеть так:
CREATE TABLE `control_table` (
`id_control` int(11) NOT NULL AUTO_INCREMENT,
`id_op` char(64) NOT NULL,
`otdel` varchar(32) NOT NULL,
`group_op` varchar(32) NOT NULL,
`auditor` varchar(128) NOT NULL,
`date_audit` date DEFAULT NULL,
`cisco` char(15) NOT NULL,
`take` enum('Yes','No') NOT NULL DEFAULT 'No',
`enable` enum('Yes','No') NOT NULL DEFAULT 'No',
`error` enum('go','o', 'n') NOT NULL DEFAULT 'go',
`err_num` tinyint(2) NOT NULL DEFAULT '1', //здесь может быть номер этой ошибки
`date` date DEFAULT NULL,
`time` varchar(5) NOT NULL,
`theme` varchar(256) NOT NULL,
`coment` text NOT NULL,
`duration` varchar(8) NOT NULL,
`class` varchar(128) NOT NULL,
PRIMARY KEY (`id_control`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;
|
| |
|
|
|
|
|
|
|
для: olejek
(12.06.2008 в 10:21)
| | Дело в том, что необходимо в одной проверке иметь 10-ть полей go, o и n, в каждое поле может вноситься произвольная цифра, количество ошибок...
Также необходимо к каждому полю написать коментарий... | |
|
|
|
|
|
|
|
для: maxfade
(16.06.2008 в 09:38)
| | а чем вас не устраивает предложенный вариант?
заводите хоть по сто раз для проверки go, o или n в виде отдельных строк в таблице, а не плодите количество столбцов, а то это уже не реляционная бд получается а чёрт знает что, я бы на вашем месте почитал литературу по проектированию бд
без обид :) | |
|
|
|
|