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

Форум MySQL

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

 

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

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

тема: Как мне подсчитать среднее значение столбца?
 
 автор: jurij_83   (29.03.2006 в 11:13)   письмо автору
 
 

Нужна помощь.

Сделал базу данных.

Как мне подсчитать (не среднее значение строчки), а всего столбца?


Сейчас у меня выводит:

subject_name | subject_teacher | T-P | a (это среднее)
matematika | Jonaitis | T | 9
biologija | Tonaitis | P | 6.5
fizika | Ronaitis | T | 8.5

А я хочу, чтобы выводило бы так:

subject_name | subject_teacher | T-P | a (это среднее)
matematika | Jonaitis | T | 9
biologija | Tonaitis | P | 6.5
fizika | Ronaitis | T | 8.5
| 8.0

в смысле хочу, чтобы выводило бы среднее значение всего столбца (9 + 6.5 + 8.5)/3 = 8
Но в базе может быть и 10 записей (в смысле 1+2+...+n)/n:

matematika | Jonaitis | T | 9
biologija | Tonaitis | P | 6.5
fizika | Ronaitis | T | 8.5
...................................................
.................................................
n | n| n| n

Как мне это сделать?

Вот код:

<?php
require_once ("../config.php");
?>

<?php
$table_name = "tablica";

$countPeoplesSQL = "SELECT count(distinct(subject_teacher)) AS kiekis FROM $table_name";
$countPeoplesResult = mysql_query($countPeoplesSQL, $connection) or die("ERROR: ".mysql_error());

$kiekisRow = mysql_fetch_assoc($countPeoplesResult);
$kiekis = $kiekisRow['kiekis'];

$sql = "SELECT subject_name, subject_teacher, t_p, avg(a1) AS avg_a1, avg(a2) AS avg_a2, avg(a3) AS avg_a3, avg(a1 + a2 + a3)/3 AS average_row_a
FROM $table_name
GROUP BY subject_teacher, t_p
ORDER BY average_row_a DESC
";

$result = @mysql_query($sql,$connection) or die("ERROR: ".mysql_error());
?>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<title>name </title>

</head>
<body>

<table width="100%" border="1" align="center" cellpadding="5" cellspacing="0">
<tr align="center">
<th><p>subject_name</p></th>
<th>subject_teacher</p></th>
<th>T-P</p></th>
<td><p>a</p></td>
</tr>

<?php
while ($row = mysql_fetch_array($result)) {
$subject_name = $row['subject_name'];
$subject_teacher = $row['subject_teacher'];

$t_p = $row['t_p'];

$avg_a1 = $row['avg_a1'];
$avg_a2 = $row['avg_a2'];
$avg_a3 = $row['avg_a3'];

$average_row_a = $row['average_row_a'];
?>

<tr>
<td valign="top"><p align="center"><?php echo "$subject_name"; ?> </p></td>
<td valign="top"><p align="center"><?php echo "$subject_teacher"; ?></p></td>
<td valign="top"><p align="center"><?php echo "$t_p"; ?></p></td>
<td valign="top"><p align="center"><?php echo number_format("$average_row_a", "2"); ?></p></td>
</tr>
<tr>

<?
}
mysql_close($connection);
?>
</table>

</body>
</html>

   
 
 автор: Trianon   (29.03.2006 в 11:57)   письмо автору
 
   для: jurij_83   (29.03.2006 в 11:13)
 

Прошу прощения, но без оформления тегами (в форме ввода - правее имени и пароля) Вашу задачу просто не прочитать. Ниже идет Ваше сообщение:
===============================================
Нужна помощь.

Сделал базу данных.

Как мне подсчитать (не среднее значение строчки), а всего столбца?


Сейчас у меня выводит:

subject_name| subject_teacher | T-P | a (это среднее)
 matematika  | Jonaitis        | T   | 9
 biologija   | Tonaitis        | P   | 6.5
 fizika      | Ronaitis        | T   | 8.5


А я хочу, чтобы выводило бы так:

subject_name| subject_teacher | T-P | a (это среднее)
 matematika  | Jonaitis        | T   | 9
 biologija   | Tonaitis        | P   | 6.5
 fizika      | Ronaitis        | T   | 8.5
                                    | 8.0


в смысле хочу, чтобы выводило бы среднее значение всего столбца (9 + 6.5 + 8.5)/3 = 8
Но в базе может быть и 10 записей (в смысле 1+2+...+n)/n:

 matematika    | Jonaitis        | T   | 9
 biologija     | Tonaitis        | P   | 6.5
 fizika        | Ronaitis        | T   | 8.5
...................................................
.................................................
 n             |                n|    n|  n


Как мне это сделать?

Вот код:
<?php
  
require_once ("../config.php");
?>

<?php
$table_name 
"tablica";

$countPeoplesSQL "SELECT count(distinct(subject_teacher)) AS kiekis FROM $table_name";
$countPeoplesResult mysql_query($countPeoplesSQL$connection) or die("ERROR: ".mysql_error());

$kiekisRow mysql_fetch_assoc($countPeoplesResult);
$kiekis $kiekisRow['kiekis'];

$sql "SELECT subject_name, subject_teacher, t_p, avg(a1) AS avg_a1, avg(a2) AS avg_a2, avg(a3) AS avg_a3, avg(a1 + a2 + a3)/3 AS average_row_a
        FROM 
$table_name
        GROUP BY subject_teacher, t_p
    ORDER BY average_row_a DESC
        "
;

    
$result = @mysql_query($sql,$connection) or die("ERROR: ".mysql_error());
?>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<title>name </title>

</head>
<body>

  <table width="100%" border="1" align="center" cellpadding="5" cellspacing="0">
    <tr align="center">
      <th><p>subject_name</p></th>
      <th>subject_teacher</p></th>
      <th>T-P</p></th>
      <td><p>a</p></td>
    </tr>

<?php
        
while ($row mysql_fetch_array($result)) {
        
$subject_name $row['subject_name'];
        
$subject_teacher $row['subject_teacher'];

        
$t_p $row['t_p'];

        
$avg_a1 $row['avg_a1'];
        
$avg_a2 $row['avg_a2'];
        
$avg_a3 $row['avg_a3'];

        
$average_row_a $row['average_row_a'];
?>

  <tr>
    <td valign="top"><p align="center"><?php echo "$subject_name"?> </p></td>
    <td valign="top"><p align="center"><?php echo "$subject_teacher"?></p></td>
    <td valign="top"><p align="center"><?php echo "$t_p"?></p></td>
    <td valign="top"><p align="center"><?php echo number_format("$average_row_a""2"); ?></p></td>
  </tr>
<tr>

<?
  
}
  
mysql_close($connection);
?>
</table>

</body>
</html>

   
 
 автор: cheops (из кафе)   (29.03.2006 в 13:19)
 
   для: Trianon   (29.03.2006 в 11:57)
 

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

   
 
 автор: jurij_83   (29.03.2006 в 13:48)   письмо автору
 
   для: cheops (из кафе)   (29.03.2006 в 13:19)
 

Мне нужно вывести под низом под a (среднее значение из всего столбца - пока у меня 3 строчки занято, но их, по мере добавления в базу данных, будет пребовляться).
И нужно, чтобы как-то подсчитать это среднее значение всего столбца (в каждой строчке среднее значение каждой строчки состоит из 3 полей a1, a2, a3 этот у меня подсчитывается по avg).
Но ко всему нужно среднее значение всего столбца. Понятно ли?

   
 
 автор: cheops   (29.03.2006 в 18:21)   письмо автору
 
   для: jurij_83   (29.03.2006 в 13:48)
 

Можно оформить отдельный SQL-запрос с функцией avg(), но без группировки GROUP BY, тогда среднее значение будет вычисленно для всего столбца. Или если у вас MySQL выше 4.1.1 можно воспользоваться модификатором WITH ROLLUP
<?php
SELECT subject_name
subject_teachert_pavg(a1) AS avg_a1avg(a2) AS avg_a2avg(a3) AS avg_a3avg(a1 a2 a3)/AS average_row_a 
        FROM $table_name 
        GROUP BY subject_teacher
t_p WITH ROLLUP 
    ORDER BY average_row_a DESC 
?>

Последняя строка даст результат для всей таблицы.

   
 
 автор: jurij_83   (29.03.2006 в 20:31)   письмо автору
 
   для: cheops   (29.03.2006 в 18:21)
 

Спасибо за попытки решить проблему, но она, к сожалению, пока остаётся.
1. У меня версия MySQL ниже, чем 4.1.1 (кажется 3.4).
А что такое WITH ROLLUP?
2. Если убрать GROUP BY, то будет ошибка, с которой я уже когда-то сталкивался (а дело в том, что когда использую функцию avg(), то обязательно нужно группировать по GROUP BY)...

Так как мне решить мою проблему (подсчитать среднее значение столбца в зависимости от количества записей).

   
 
 автор: Trianon   (29.03.2006 в 20:53)   письмо автору
 
   для: jurij_83   (29.03.2006 в 20:31)
 

WITH ROLLUP - модификатор GROUP BY , указывающий, что нужно добавить дополнительные строки к отчету и вписать в них значения агрегатных функций над данными без учета группировки по указанным столбцам. Это если на пальцах. А вообще, по-моему им не стоит шутить. Уж больно хитрая штука, судя по описанию.

Непонятно другое. Почему это avg требует GROUP BY?
У Вас не проходит SELECT avg(a1) as a1, avg(a2) as a2 FROM $table_name ?

   
Rambler's Top100
вверх

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