Групировка отдельных ненужных записей из запроса

programmer_2006

Новичок
Групировка отдельных ненужных записей из запроса

Есть таблица со статистикой и в ней поле откуда пришол(refferer) пользователь. Админу я вывожу статистику по кейвордам которые выдираю из реферела на основе запросов от поисковиков(гугл, яндекс, рамблер и т.д.), а все остальные кейворды я должен отнести(сгрупировать) в группу Other.
Вот примерно такой у меня запрос

PHP:
SELECT `s`.`refferer` AS `keywords`   
FROM `statistics` AS `s`   
WHERE (  LOCATE( '?', `refferer` ) !=0  ) 
GROUP BY `s`.`refferer`
В итоге к меня получается такая таблица для админа
[Other]
[Other]
...
[Other]
lalala + blabla

А должна быть всего одна зпись [Other] т.е. получается мне надо как то сгрупировать в таблице записи которые не удовлетворяют определенным условиям и не похожи.
Через ПХП такое делать не очень хочется, так как прийдется и в постраничную навигацию хак делать.
МОжно ли как то решить мою задачку средствами MySQL? МОжет я не правильно подошол к решению?
Заранее спасибо
 

DiMA

php.spb.ru
Команда форума
select if(LOCATE( '?', `refferer` ) !=0, s.referer,"other") x from ...
group by x
 

programmer_2006

Новичок
Автор оригинала: DiMA
select if(LOCATE( '?', `refferer` ) !=0, s.referer,"other") x from ...
group by x
Хороший вариант спасибо. Ед. навряд подойдет т.к. строкой WHERE ( LOCATE( '?', `refferer` ) !=0 ) я извлекаю все рефереры которые могут быть от поисковиков т.е. отсеиваю те которые не содержат вообще параметров.
Потом в скрипте выполняю такую функию

PHP:
$params = explode('?',$referrer);
	    $keywords = '';
		$matches = array();
		if ( strpos( $referrer, 'google') !== FALSE || strpos( $referrer, 'msn') !== FALSE ) { 
		   if (preg_match('/q=([^&]+)/i', $referrer, $matches)) {
		   		$keywords = $matches[1];
		   		$keywords = str_replace(array( '+' ), ' ', $keywords );
		   }
		}elseif ( strpos( $referrer[0], 'yahoo') !== FALSE ) {	   
		   if (preg_match('/p=([^&]+)/i', $referrer, $matches)) {
		   		$keywords = $matches[1];
		   		$keywords = str_replace(array( '+' ), ' ', $keywords );
		   }
		}elseif ( strpos( $referrer[0], 'yandex') !== FALSE ) {	   
		   if (preg_match('/text=([^&]+)/i', $referrer, $matches)) {
		   		$keywords = $matches[1];
		   		$keywords = str_replace(array( '+' ), ' ', $keywords );
		   }
		}else {
			if (preg_match('/query=([^&]+)/i', $referrer, $matches)) {
		    	$keywords = $matches[1];
		    	$keywords = str_replace(array( '+' ), ' ', $keywords );
			}
			if (preg_match('/keyword=([^&]+)/i', $referrer, $matches)) {
				$keywords = $matches[1];
	    		$keywords = str_replace(array( '+' ), ' ', $keywords );
			}
		}
		
	    $keywords = empty( $keywords ) ? '[ Other ]' : $view->truncate( $keywords, 50, '...', true);
А в Вашем варианте у меня все строки, даже те которые мне нужны будут определятся как Other. Ед. можно усложнить запрос и попытатся перенести в него проверку по регулярным выражением, но как это хреново будет, можно создать процедуру, но тоже не хочется так как в проекте их нет... Может надо как то запрос по другому построить...
 

DiMA

php.spb.ru
Команда форума
по-умному, статистика пишется так:
1. сброс данных с каждого скрипта в тхт файл
2. каждые 10 секунд кроном сбор данных из файла в базу и вычисление всех нужных для статистики данных (для твоей задачи вычисляем новое поле)
3. отчет просто выбирает данные, без сложных запросов (по новому полю)
 

programmer_2006

Новичок
Спасибо теперь буду знать как правильно делать статистику. Но времени сейчас переделывать не проект стартанул и клиент просит быстро пофиксит проблему.
 
Сверху