2013-09-03 9 views
1

Я в тупике. Я хочу получить средние «клики» из «сообщений», но выбрасываю максимальное значение, которое обычно настолько велико, что оно перескакивает порог, когда я хочу отображать все сообщения с кликами выше среднего. Я также хочу отказаться от самого низкого значения по той же причине. Мой код:Как получить среднее значение из столбца mysql минус самое высокое и самое низкое значение

//get the sum of the clicks from all posts  

$gettotalsum = mysql_query("SELECT sum(clicks) AS click_total FROM posts WHERE clicks > '0' "); 

$clicksum = @mysql_fetch_array($gettotalsum); 


//get the number of posts that have clicks      
$postcount = mysql_query("SELECT postid FROM posts WHERE isactive = 'y' AND clicks > '0' "); 

$clickcount = mysql_num_rows($postcount); 

Я подозреваю, что эти два запроса выше, что мне нужно изменить, чтобы отфильтровать самые высокие и самые низкие значения кликов - но как?

и вот остальная часть моего кода FWIW:

//multiply to get the average, then round it off 
$average = $clicksum['clicks']/$clickcount; 
$average = round($average); 

//display posts that are equal to or above average 

$getposts = mysql_query("SELECT postid, posturl, posttitle, clicks FROM posts WHERE clicks >= $average order by clicks DESC"); 

    while ($aboveaverageposts = @mysql_fetch_array($getposts)) { 

    //code to format output goes here 

    } 

Я подозреваю, что весь этот код может быть упрощен, но самое главное, сейчас я ищу, чтобы отфильтровать самые высокие и самые низкие значения.

Заранее спасибо.

ответ

1

Чтобы получить среднее значение минус наивысшие и самые низкие значения (как говорит ваш заголовок), немного сложно. Я хочу, чтобы это работало:

SELECT (sum(clicks) - max(clicks) - min(clicks))/(count(*) - 2) as avgclicks 
FROM posts 
WHERE clicks > '0' 

К сожалению, вы могли бы иметь дубликаты записей с наибольшим и наименьшим значениями, поэтому счетчик woud быть выключен. Этот подход должен работать:

select avg(clicks) as avgclicks 
from posts p cross join 
    (select max(clicks) as maxclicks, min(clicks) as minclicks 
     from posts p 
     where clicks > 0 
    ) minmax 
where clicks > minmax.minclicks and clicks < minmax.maxclicks; 

Чтобы получить все, что с «выше среднего» кликов, вы можете поместить это в пункте where:

select p.* 
from posts p 
where clicks > (select avg(clicks) as avgclicks 
       from posts p cross join 
        (select max(clicks) as maxclicks, min(clicks) as minclicks 
         from posts 
         where clicks > 0 
        ) minmax 
       where clicks > minmax.minclicks and clicks < minmax.maxclicks 
       ) 
+0

Это было! Имея всего несколько настроек, чтобы упорядочить результаты и добавить другие критерии для выбора, он отлично работал! Благодаря! – Geo316

1

Вам нужно придумать простой алгоритм, чтобы решить, что это за порог, и вы не должны предполагать, что это всего лишь 1 столбец. Это лучше, чтобы выяснить процент, как говорят, все записи 5x выше среднего (давайте предположим, что ваше среднем 5, так что все 25 или более мусор, очевидно, настроить это к вашим потребностям)

SELECT AVG(clicks) AS average_click 
FROM posts 
HAVING clicks < AVG(clicks)*5 

PS: Я написал этот SQL из памяти, поэтому синтаксис может быть не идеальным.

+1

Я считаю, что это не исправить полностью. Если у него есть, скажем, очень большое экстремальное значение (например, имея в среднем 5 и максимум 1 000 000), это сильно повлияет на результаты. Я считаю, что использование STD() '(стандартное отклонение) было бы лучше, но ему нужно будет изучить это немного. –