Так же каждый элемент имеет кучу (несколько десятков) параметров. Ломаю мозг, но не могу придумать: как получить список самых популярных параметров в пределах некоторой группы?
Пример выборки для группы 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 изначально массив полученных записей.
Как временный вариант написал на пыхе, может так понятнее будет:
$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ировка требуется по каждому полю отдельно. то есть решение есть - запрос на каждое поле. но для высокой нагрузки это слишком много.
Подумал я, подумал. И подумал, что не могу предложить решение лучше. Исключение остается только для хранимой процедуры. В ней имело бы смысл проходить по каждому ряду самому и обрабатывать тоже. Иного решения силами sql не вижу, потому что groupировка требуется по каждому полю отдельно. то есть решение есть - запрос на каждое поле. но для высокой нагрузки это слишком много.
Спустя 6 минут, 50 секунд (6.04.2010 - 15:49) Nikitian написал(а):
Да, тоже в сторону хранимой процедуры смотрю.
Всем спасибо, тема закрыта, если кто не скреативит решение на чистом sql в один запрос и без падения бд =)
Всем спасибо, тема закрыта, если кто не скреативит решение на чистом sql в один запрос и без падения бд =)
Спустя 2 минуты, 52 секунды (6.04.2010 - 15:52) sergeiss написал(а):
Я уже говорил свое мнение: один запрос получить элементарно
Но состоять он будет из множества "мелких запросиков" типа того, что ты написал.
