2013-09-03 3 views
1

내가 엉망입니다. 나는 "posts"에서 평균 "클릭 수"를 얻고 싶지만 일반적으로 평균보다 높은 클릭 수를 가진 모든 게시물을 표시 할 때 임계 값을 왜곡 할 수있는 최고 값을 버립니다. 같은 이유로 가장 낮은 값을 버리기를 원합니다. 내 코드는 다음과 같습니다.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

평균값에서 가장 높은 값과 가장 낮은 값을 뺀 값을 구하는 것은 약간 까다 롭습니다. 카운트가 꺼져 woud 있도록

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

불행하게도, 당신은 최대 및 최소 값을 중복 레코드를 가질 수있다 :이 일을합니다. 이 방법을 작동합니다 :

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 열이라고 가정하면 안됩니다. 평균 위의 모든 항목 5 배 말처럼 비율을 파악하는 것이 좋습니다

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

PS (분명 여러분의 필요에이를 조정할,의는 평균 5 가정하자, 그래서 아무것도 25 이상 쓰레기) : 내가 쓴 이 SQL은 메모리에서이므로 구문이 완벽하지 않을 수도 있습니다.

+1

난이 완전히 해결되지 믿습니다. 예를 들어, 평균이 5이고 극단이 1,000,000 인 극단적 인 값을 가진다면 결과에 많은 영향을 미칩니다. 나는'STD()'(표준 편차)를 사용하는 것이 더 좋을 것이라고 생각하지만, 조금 연구해야 할 것이다. –

관련 문제