【问题标题】:How to compare two most recent records foreach column name pair如何比较每个列名对的两条最新记录
【发布时间】:2012-11-27 00:00:11
【问题描述】:

我正在使用 PHP 和 MySQL,并具有以下表结构:

        date             |      name      |       value

2012-11-20 10:30:03            visits              503
2012-10-23 09:30:03           pageviews            567
2012-09-23 09:30:03           pageviews            345
2012-10-20 11:30:03            visits              874

我需要运行一个 MySQL 查询,比较每个名称/值对的两条最新记录,并返回名称/值对的值是下降还是上升。

例如,使用上面的示例数据,查询将返回网页浏览量上升而访问量下降。

【问题讨论】:

  • 你想只使用 MYSQL 还是也想使用 PHP?

标签: php mysql compare


【解决方案1】:

如果您想在MySQL 中完全进行比较,您可以分两步完成。

在此处查看 SQLFiddle - http://sqlfiddle.com/#!2/80677/9/0。注意 - SQLFIDDLE 不允许CREATE TEMPORARY TABLE,所以我不得不将其修改为CREATE TABLE

首先,您需要创建一个临时表,其中仅包含每个 name 组的最后 2 行-

CREATE TEMPORARY TABLE tmptable
   SELECT * FROM
        (SELECT IF(@prev != sq.name, @rownum:=1, @rownum:=@rownum + 1) AS rownumber, @prev:=sq.name, sq.* FROM
       (SELECT * FROM table_name , (SELECT @rownum:=0, @prev:=0) r ORDER BY name, date DESC ) sq
   ) q WHERE q.rownumber <=2;

然后您将比较这 2 行中的每一行以确定它是上升还是下降-

SELECT a.name,
       IF(a.value > b.value, 'up', 'down') action
FROM tmptable a
JOIN tmptable b 
ON a.name = b.name AND a.date > b.date ORDER BY a.date DESC;

如果您的表结构与您发布的相同 - (date,name,value) - 那么您需要做的唯一更改就是在 CREATE TEMPORARY TABLE 查询中显示 table_name 的位置。

然后你可以在 PHP 中回显 -

while($row = ...fetch_array($query)){
  echo $row['name'] ." -> ".$row['action']."<br />";
}

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多