Вычисление среднего у поля для набора нодов

Главные вкладки

Аватар пользователя swpools swpools 16 июля 2011 в 20:39

Задача: необходимо для одного из полей набора нодов вычислить среднее число (исключая пустые), минимальное и максимальное и сделать вывод в блок.

Подскажите как лучше реализовать.

Нашел в Инете, что может быть полезно использовать Computed_Field и views_customfield.
Не очень понятно как computed_field может помочь если нужно обработать значения всех нодю
Что думаете по данному поводу? Какие есть варианты?

Комментарии

Аватар пользователя niko niko 16 июля 2011 в 22:02

что то вроде...

<?php
$dbh 
db_query("SELECT AVG(filed_price_value) FROM {content_field_price} pr left join {node} n on (pr.nid=n.nid) where n.type='product'");
$items = array();
while(
$row db_fetch_array($dbh)){
  
$items[] = $row;
}
echo 
theme('item_list'$items);?>
Аватар пользователя swpools swpools 16 июля 2011 в 22:18

Спасибо большое за ответ.
Я так интерпретирую, что никакими средствами модулей задача не решается, а самое правильное это прямой запрос в БД по типу того, что приведен.

Аватар пользователя niko niko 17 июля 2011 в 0:12

Я не вижу смысла писать такой модуль и выкладывать его на друпал.орг.
Если нужно такой модуль модуль можно и самому написать - за основу взяв этот код

собственно, если посмотреть подобный модуль, если бы он существовал или существует то там был бы подобный код с вариативной частью - выбор по каким полям считать может что то еще

Аватар пользователя swpools swpools 17 июля 2011 в 22:16

Очень помог разобраться код с комментария в http://www.drupal.ru/node/21432

Мой код в результате:

<?php
$count_accounts_tot = db_fetch_array(db_query('SELECT COUNT(uid) FROM {users}'));
$count_accounts_blo = db_fetch_array(db_query('SELECT COUNT(uid) FROM {users} WHERE status=0'));
$count_nodes_tot = db_fetch_array(db_query('SELECT COUNT(nid) FROM {node}'));
$count_nodes_pub = db_fetch_array(db_query('SELECT COUNT(nid) FROM {node} WHERE status=1'));
$count_comments_tot = db_fetch_array(db_query('SELECT COUNT(cid) FROM {comments}'));
$count_comments_pub = db_fetch_array(db_query('SELECT COUNT(cid) FROM {comments} WHERE status=0'));
$count_product_tot = db_fetch_array(db_query('SELECT COUNT(nid) FROM {content_type_product}'));
$avg_product_price = db_fetch_array(db_query('SELECT AVG(field_price_single_value) FROM {content_type_product}'));
$min_product_price = db_fetch_array(db_query('SELECT MIN(field_price_single_value) FROM {content_type_product}'));
$max_product_price = db_fetch_array(db_query('SELECT MAX(field_price_single_value) FROM {content_type_product}'));

$header = array('Показатель', 'Значение');
$rows = array
(
array(t('Аккаунтов'), $count_accounts_tot['COUNT(uid)']-1),
array(t('…заблокированных'), $count_accounts_blo['COUNT(uid)']-1),
array(t('Документов'), $count_nodes_tot['COUNT(nid)']),
array(t('…опубликованных'), $count_nodes_pub['COUNT(nid)']),
array(t('Комментариев'), $count_comments_tot['COUNT(cid)']),
array(t('…опубликованных'), $count_comments_pub['COUNT(cid)']),
array(t('Всего продуктов'), $count_product_tot['COUNT(nid)']),
array(t('Средняя цена продукта'), $avg_product_price['AVG(field_price_single_value)']),
array(t('Минимальная цена продукта'), $min_product_price['MIN(field_price_single_value)']),
array(t('Максимальная цена продукта'), $max_product_price['MAX(field_price_single_value)']),
);
return theme('table', $header, $rows);
?>