Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: три запроса и вывод в одной таблице
 
 автор: maxfade   (09.06.2008 в 13:55)   письмо автору
 
 

Есть три таблицы.

Таблица № 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   (10.06.2008 в 16:23)   письмо автору
 
   для: maxfade   (09.06.2008 в 13:55)
 

Неужели нет мыслей ?

   
 
 автор: olejek   (10.06.2008 в 17:15)   письмо автору
 
   для: maxfade   (10.06.2008 в 16:23)
 

А что содержат столбцы go1, go2, go3, n1, n2, n3?

   
 
 автор: maxfade   (11.06.2008 в 10:05)   письмо автору
 
   для: olejek   (10.06.2008 в 17:15)
 

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

Примерно так:

|----------------------ФИО---|--Апрель---|----Май----|----Июнь---|----За квартал----|
|------------------Иванов---|------15------|------5------|------1-------|----------21----------|
|------------------Петров---|------5--------|------3------|------7-------|----------15----------|
|---Общее за квартал---|------20------|------8------|------8-------|----------36----------|


Как это проще организовать с меньшим количеством запросов?

   
 
 автор: olejek   (11.06.2008 в 10:54)   письмо автору
 
   для: maxfade   (11.06.2008 в 10:05)
 

Да, трудно, конечно, вас понять. Я спрашивал, что содержат столбцы go1, n1..., а вы пишите "там только цифры" - это я и так вижу. Я имел ввиду их назначение.
А таблица quarter_table вообще не понятно для чего нужна. Похоже, что она хранит начало и конец месяца, но это и так можно узнать.
Я к тому, что структура базы данных, по-моему, не хорошо продумана. Лучше потратить много времени на построение базы данных, зато потом сэкономить массу времени на построении запросов.

   
 
 автор: maxfade   (11.06.2008 в 12:08)   письмо автору
 
   для: 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 ;

   
 
 автор: olejek   (11.06.2008 в 14:57)   письмо автору
 
   для: 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, который отобразит это в том виде, который вы хотите.

Но это один из вариантов, есть много других.

   
 
 автор: maxfade   (11.06.2008 в 21:55)   письмо автору
 
   для: olejek   (11.06.2008 в 14:57)
 

я об этом уже думал, но проблема в том, что допустим в одной проверке сотрудника может быть несколько go, о и n, причем необходимо обязательно записать коментарий по каждой ошибке. + еще много параметров по ней, которые отображены в 'control_table'.

Может есть другой вариант постраения таблиц, необходимый для данной задачи?

Но только с возможность подробного описания каждой проверки...

   
 
 автор: olejek   (12.06.2008 в 10:21)   письмо автору
 
   для: 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 ; 

   
 
 автор: maxfade   (16.06.2008 в 09:38)   письмо автору
 
   для: olejek   (12.06.2008 в 10:21)
 

Дело в том, что необходимо в одной проверке иметь 10-ть полей go, o и n, в каждое поле может вноситься произвольная цифра, количество ошибок...

Также необходимо к каждому полю написать коментарий...

   
 
 автор: ronin80   (16.06.2008 в 11:29)   письмо автору
 
   для: maxfade   (16.06.2008 в 09:38)
 

а чем вас не устраивает предложенный вариант?

заводите хоть по сто раз для проверки go, o или n в виде отдельных строк в таблице, а не плодите количество столбцов, а то это уже не реляционная бд получается а чёрт знает что, я бы на вашем месте почитал литературу по проектированию бд

без обид :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования