0

私のコードでは、次の時間に存在する行数を取得します。

今日 昨日 2 日前 3 日前 4 日前 5 日前 6 日前 7 日前 今週 今月 先月 今年

「今月」を除いて、すべての時間がうまく機能しています。これは正しく計算されていないようです。ここに私のSQLがあります:

$sql = mysql_query("select `website`, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE()) then 1 else 0 end) AS c_day, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 1 DAY) then 1 else 0 end) AS c_yesterday, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 2 DAY) then 1 else 0 end) AS c_2_days, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 3 DAY) then 1 else 0 end) AS c_3_days, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 4 DAY) then 1 else 0 end) AS c_4_days, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 5 DAY) then 1 else 0 end) AS c_5_days, 
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 6 DAY) then 1 else 0 end) AS c_6_days,
                    sum(case when DATE(FROM_UNIXTIME(`date_assigned`)) = DATE(CURDATE() - INTERVAL 7 DAY) then 1 else 0 end) AS c_7_days,
                    sum(case when WEEK(FROM_UNIXTIME(`date_assigned`)) = WEEK(CURDATE()) then 1 else 0 end) AS c_week, 
                    sum(case when MONTH(FROM_UNIXTIME(`date_assigned`)) = MONTH(CURDATE()) then 1 else 0 end) AS c_month,
                    sum(case when MONTH(FROM_UNIXTIME(`date_assigned`)) = MONTH(CURDATE() - INTERVAL 1 MONTH) then 1 else 0 end) AS c_last_month,
                    sum(case when YEAR(FROM_UNIXTIME(`date_assigned`)) = YEAR(CURDATE()) then 1 else 0 end) AS c_year
                    from `assignments`
                    where `id_dealership`!='65' and `id_dealership`!='77' and `id_dealership`!='89'
                    group by `website`
                    order by `website` asc
                    ") or die(mysql_error());

ご覧のとおり、c_month私に問題を引き起こしているのはこれです。c_last_month が問題なく動作していることを考えると、なぜこれが起こっているのかわかりません。

もう一度編集:

テーブル構造といくつかのサンプルデータを次に示します。

CREATE TABLE IF NOT EXISTS `assignments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_dealership` int(11) NOT NULL,
  `id_lead` int(11) NOT NULL,
  `date_assigned` int(11) NOT NULL,
  `website` varchar(255) NOT NULL DEFAULT '',
  `make` varchar(255) NOT NULL DEFAULT '',
  `model` varchar(255) NOT NULL DEFAULT '',
  `ip_address` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `id_dealership` (`id_dealership`),
  KEY `id_lead` (`id_lead`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9848 ;


(1165, 40, 1373, 1325540129, 'website.com', 'Ford', 'Edge', ''),
(1164, 34, 1372, 1325539601, 'website.com', 'Ford', 'F-350', ''),
(1163, 34, 1371, 1325537245, 'website.com', 'Ford', 'Focus', ''),
(1162, 34, 1370, 1325529221, 'website.com', 'Ford', 'Flex', ''),
4

2 に答える 2

2

MySQLsMONTH()は、date から現在の月を返します。これは、スクリプト内の条件が一致することのみを意味します。

  • オン2012-10-01- 1 日
  • オン2012-10-05- 5 日間
  • オン2012-10-30- 30 日 (正しい)

したがって、スクリプトは月に一度、最後の日に正しく機能しています:)そして、 「今月の初めからのビューの数」を表示しています。

したがって、基本的には条件を置き換えるだけです

sum(case when MONTH(FROM_UNIXTIME(`date_assigned`)) =
    MONTH(CURDATE()) then 1 else 0 end) AS c_month

これを使用すると(過去31日間のアイテムがカウントされます):

SUM(CASE (`date_assigned` > (CURDATE() - INTERVAL 1 MONTH))
   THEN 1 ELSE 0 END) AS c_month

もう一つ、あなたのパフォーマンスが心配です。別のテーブルで要約情報をカウントし(または既存のテーブルに列を追加し)、事前に計算されたデータを使用し、スクリプトでそれらを更新します(cronなどを介して実行されます)。

データが正確である必要がある場合は、インデックスを追加してdate_assigned(またはむしろにid_dealership, date_added)、条件を次のように拡張します。

AND `date_added` >= (CURDATE() - INTERVAL 1 YEAR))

1 年前のレコードのみを処理します (それ以上はありません)。

于 2012-11-04T08:27:35.290 に答える
0

あなたの状態

sum(case when MONTH(FROM_UNIXTIME(`date_assigned`)) = MONTH(CURDATE())
     then 1 else 0 end) AS c_month,

データベースにさらに情報が含まれると正しい情報が返されないため、使用しないでください。

MONTH('2011-11-14') = MONTH('2012-11-04') = MONTH('2013-11-24')

今月の統計を表示したい場合は、MONTH()とYEAR()の両方をチェックする必要があります。今月は11月だけでなく、2012年11月です。

先月も同じです。

于 2012-11-04T09:24:51.113 に答える