2011-01-11 9 views
11

私は以下のMySQLクエリを持っています。私はそれを調整しようとしています(今年の今月の結果のみを取り出すようにしています。 PHPのtime()によって生成されたUNIXタイムスタンプがtimeカラム(referralsテーブルの下)に格納されているので、以下の設定ではt2.timeとなります。当月のMySQLのみ?

私の問題は、どのように進むべきかわかりません。WHERE句の最後に以下を追加するようなものになると思いますか? =>AND t2.time IS WITHIN THE CURRENT MONTH(キャップ​​は質問の残りと問題を区別するためにちょうどあります)しかし、私は現在の月の中にそれがあるかどうかチェックする方法がわかりません。

MySQLのクエリ:

SELECT t1.username, 
     t1.website, 
     SUM(IF(t2.type = 'in', 1, 0)) AS in_count, 
     SUM(IF(t2.type = 'out', 1, 0)) AS out_count 
FROM users AS t1 
     JOIN referrals AS t2 
     ON t1.username = t2.author 
WHERE t1.website != '' 
GROUP BY t1.username, 
      t1.website 
ORDER BY in_count DESC 
LIMIT 0, 10 

は、すべての助けに感謝します! :B

+0

データ型「時間」には年+月の詳細が格納されていませんか?これはあなたのアプリケーションが2012年に問題になることを意味します – ajreal

+0

@ajreal私はあなたを理解していませんが、型はdb内のINTであり、UNIXのタイムスタンプはPHPのtime()によって生成されます。 – newbtophp

+0

データ型は 'time'なので、私の悪い、すべてのコストで、列や表として予約されたキーワードを使用しないでください – ajreal

答えて

13

あなたは

date_format(from_unixtime(t2.`time`), '%Y-%m')=date_format(now(), '%Y-%m') 

ようfrom_unixtimeを使用することができますしかし、私は、データ型integerは、この要件のためにとても適していないと思い、私が使用して思うだろう

datetimeが適しており、この列にインデックスを作成して、フィルタリングも容易にできます。

t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01' 

又は

2

これはおそらく予想以上に簡単です。

SELECT t1.username, 
     t1.website, 
     SUM(IF(t2.type = 'in', 1, 0)) AS in_count, 
     SUM(IF(t2.type = 'out', 1, 0)) AS out_count 
FROM users AS t1 
     JOIN referrals AS t2 
     ON t1.username = t2.author 
WHERE t1.website != '' 
     AND t2.time >= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY) 
GROUP BY t1.username, 
      t1.website 
ORDER BY in_count DESC 
LIMIT 0, 10 
-1

これは、MySqlのMONTH機能をチェックしてください。

あなたはfireeyedboyからのコメントで助けを取得した後に編集MONTH(FROM_UNIXTIME(t2.time)) = Month(NOW())

のような条件を追加することができます。

+0

月関数は、(UNIXのタイムスタンプではなく)MySQLの日付にparemeter /引数を必要としません - (誤解されていないか間違っていない限り)? – newbtophp

+0

@newbtophp - そうです。私は、t2.timeはmysqlのdateTimeフィールドであると仮定します。それ以外の場合、time値から月を決定する方法はありません。 –

+1

'MONTH(FROM_UNIXTIME(your_timestamp))'を使用してください –

66

YEAR()MONTH()functionsを使用して結果を制限する必要があります。このようなあなたのクエリのWHERE一部を変更します。

WHERE t1.website != '' 
AND YEAR(time) = YEAR(NOW()) 
AND MONTH(time) = MONTH(NOW()) 
+0

from_unixtime()と組み合わせてこれを使用してくれました(前月のデータを取得する) – Andrew

2
date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m') 
where t2.time >= extract(YEAR_MONTH from CURRENT_DATE) 
    and t2.time < extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH) 

このt2.timeは日時型であると仮定する。整数のUNIXタイムスタンプの場合は、UNIX_TIMESTAMP()関数を使用して、作成した上限および下限の日時境界を変換できます。

0

パフォーマンスを向上させるには( - >インデックスを使用する)、日付欄にインデックスを作成し、where句に「between」を作成します。

select ... from my_table where my:date_field between concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01') 
and adddate(concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01'), interval 1 month);