1

私は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

名前と値のペアごとに最新の 2 つのレコードを比較し、名前と値のペアの値が下がったか上がったかを返す MySQL クエリを実行する必要があります。

たとえば、上記のサンプル データを使用すると、クエリは、訪問数が減少している間にページビューが増加したことを返します。

4

1 に答える 1

1

で完全に比較したい場合はMySQL、2 つのステップで実行できます。

ここで 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)- 変更する必要があるtable_nameのは、CREATE TEMPORARY TABLEクエリ内の場所だけです。

PHPでは、エコーできます-

while($row = ...fetch_array($query)){
  echo $row['name'] ." -> ".$row['action']."<br />";
}
于 2012-11-27T04:22:37.163 に答える