1

ID、rank、chart_date、およびpageviewsのテーブルがあります。これは、夜間に実行され、そのIDのページビュー数をコンパイルするcronジョブに基づいています。

例えば:

ID   |   RANK   |   PAGEVIEWS   |  CHART_DATE
5          1           100         2012-10-14
9          2           75          2012-10-14
13         3           25          2012-10-14
9          1           123         2012-10-13
5          2           74          2012-10-13
19         3           13          2012-10-13

そこで、2012-10-14に基づいて今日のチャートを取得し、データを1-3でランク付けしています。ただし、前日のIDのランクも表示したいと思います。

たとえば、2012-10-14ではID 5が1にランク付けされましたが、2012-10-13では2にランク付けされました。

1つのクエリでこれを行うことはできますか?または、今日に基づいて結果をループし、IDごとにクエリを実行する必要がありますか?

4

2 に答える 2

2

1つのクエリでこれを行うことはできますか?

可能ですが、今日の日付のテーブルと昨日の日付のテーブルの間にJOINが必要です。

SELECT today.*, yesterday.rank
    FROM yourtable AS today
    JOIN yourtable AS yesterday
        ON (today.id = yesterday.id
            AND today.chart_date = date(now())
            AND yesterday.chart_date = date(date_sub(now(), interval 1 day))
        )
    ORDER BY today.rank DESC;

あなたも違いを示すことができます:

SELECT today.*, yesterday.rank AS yest, yesterday.rank-today.rank AS incr
    FROM yourtable AS today
    LEFT JOIN yourtable AS yesterday
        ON (today.id = yesterday.id
            AND today.chart_date = date(now())
            AND yesterday.chart_date = date(date_sub(now(), interval 1 day))
        )
    ORDER BY today.rank DESC;

ID   |   RANK   |   PAGEVIEWS   |  CHART_DATE  |  YEST  |  INCR
5          1           100         2012-10-14     2     |   1
9          2           75          2012-10-14     1     |  -1
13         3           25          2012-10-14     4     |   1

LEFT JOIN昨日のデータがない場合でも、今日のデータが存在することを確認します)。

于 2012-10-16T00:04:06.780 に答える
0

テストされていませんが、次のようなものが機能するはずです。

select today.id, today.rank, yesterday.rank 
from mytable as today
left join mytable as yesterday on today.id = yesterday.id 
where today.chart_date = 2012-10-14
order by pageviews desc limit 3
于 2012-10-16T00:04:14.937 に答える