我有一张表,上面有id,rank,chart_date和pageviews。它基于每晚运行的cron作业,并为该ID编译页面浏览数。
例如:

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进行排序。但我也想显示身份证在前一天的排名。
例如,2012年10月14日,ID 5排名第一,但2012年10月13日排名第二。
我可以用一个查询来完成吗?或者我必须根据今天的结果循环查询每个ID吗?

最佳答案

我可以用一个查询来完成吗?
可以,但需要在今天日期的表和昨天日期的表之间连接:

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确保今天的数据存在,即使昨天的数据不存在)。

关于mysql - 显示今天的当前排名和昨天的排名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12905627/

10-11 10:39