[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Получение популярных параметров
Nikitian
Имеется табличка с кучей итемсов. Некоторые итемсы объединяются общей группой (групп много, но у каждого элемента только одна группа).
Так же каждый элемент имеет кучу (несколько десятков) параметров. Ломаю мозг, но не могу придумать: как получить список самых популярных параметров в пределах некоторой группы?

Пример выборки для группы 2 в картинке:



Спустя 2 минуты, 3 секунды (6.04.2010 - 14:10) glock18 написал(а):
то есть самые популярные параметры? я так понимаю параметры имеют значения, но как понять его популярность?

Спустя 2 минуты, 42 секунды (6.04.2010 - 14:12) waldicom написал(а):
чую, без having тут не обойтись.

Все это надо сделать с помощью одного запроса?

Спустя 4 минуты, 12 секунд (6.04.2010 - 14:17) Nikitian написал(а):
Частота использования. Как для одного параметра знаю:

select param1 from table where groupid=x group by param1 order by count(param1) desc limit 1

Но вот параметров много и каждый так дёргать не вариант

Спустя 36 минут, 18 секунд (6.04.2010 - 14:53) glock18 написал(а):
опять не понял. что значит использование? значение поля null - не используется, а ненулл - используется. нужно посчитать ненулевые значения, при этом сравнивать количества нужно в колонках одной и той же таблицы?

Спустя 4 минуты, 48 секунд (6.04.2010 - 14:58) Nikitian написал(а):
Получаем несколько записей из таблицы. У каждой записи некоторое количество полей. Значения в полях могут совпадать. Так вот, какое значение чаще всего встречается в соответствующем поле - то и оставляем. На выходе массив: поле=>самое частое значение в нём.
Как временный вариант написал на пыхе, может так понятнее будет:

$content=sql_query('select * from table where groupid='.intval($groupid));
if(is_array($content) && sizeof($content)>0)
{
$items=array();
foreach($content as $res)
foreach($res as $k=>$v)
if(!isset($items[$k][$v]))
$items[$k][$v]=1;
else
$items[$k][$v]++;
foreach($items as &$item)
{
asort($item);
$item=array_slice($item,-1,1);
$item=array_keys($item);
$item=$item[0];
}
print_r($items);
}

В $content изначально массив полученных записей.

Спустя 44 минуты, 9 секунд (6.04.2010 - 15:42) sergeiss написал(а):
Цитата (Nikitian @ 6.04.2010 - 15:17)
Но вот параметров много и каждый так дёргать не вариант

Я тут посидел, "помедитировал"... Других вариантов не вижу чегой-то. По-любому для каждого параметра свой запрос получается.
Их можно объединить все в один сложный запрос, но по каждому всё равно будет индивидуальный запрос.

Спустя 32 секунды (6.04.2010 - 15:42) glock18 написал(а):
Понял теперь.

Подумал я, подумал. И подумал, что не могу предложить решение лучше. Исключение остается только для хранимой процедуры. В ней имело бы смысл проходить по каждому ряду самому и обрабатывать тоже. Иного решения силами sql не вижу, потому что groupировка требуется по каждому полю отдельно. то есть решение есть - запрос на каждое поле. но для высокой нагрузки это слишком много.

Спустя 6 минут, 50 секунд (6.04.2010 - 15:49) Nikitian написал(а):
Да, тоже в сторону хранимой процедуры смотрю.
Всем спасибо, тема закрыта, если кто не скреативит решение на чистом sql в один запрос и без падения бд =)

Спустя 2 минуты, 52 секунды (6.04.2010 - 15:52) sergeiss написал(а):
Я уже говорил свое мнение: один запрос получить элементарно smile.gif Но состоять он будет из множества "мелких запросиков" типа того, что ты написал.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.