1

私は困惑しています。「投稿」から平均「クリック」を取得したいのですが、平均を超えるクリックですべての投稿を表示したい場合、通常は非常に高いため、しきい値を歪める最高値を捨てます。同じ理由で、最低値も破棄したいと思います。私のコードは次のとおりです。

//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);   

上記の 2 つのクエリは、クリック値の最高値と最低値をフィルター処理するために変更する必要があると思われますが、どのようにすればよいのでしょうか?

そして、これが私のコード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

    }

このコードはすべて合理化できると思いますが、今最も重要なのは、最高値と最低値をフィルタリングすることです。

前もって感謝します。

4

2 に答える 2

1

平均から最高値と最低値を差し引いた値を取得するのは (タイトルが示すように) 少しトリッキーです。これを機能させたい:

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
               )
于 2013-09-03T20:26:33.640 に答える
1

このしきい値が何であるかを決定するには、単純なアルゴリズムを考え出す必要があり、1 列だけであると想定すべきではありません。平均の 5 倍のエントリなど、パーセンテージを計算することをお勧めします (平均が 5 であると仮定すると、25 以上のものはガベージであり、明らかにニーズに合わせて微調整してください)。

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

PS: この SQL はメモリから作成したため、構文が完全ではない可能性があります。

于 2013-09-03T20:04:38.830 に答える