web-dev-qa-db-ja.com

MySQLは今月のみですか?

次のMySQLクエリがあり、現在の月(現在の年)内の結果のみをフェッチするように調整しようとしています。MySQLの構造に関する詳細情報が必要になる可能性があるので、ここで説明します。 -PHPのtime()によって生成されたUNIXタイムスタンプがtime列(referralsテーブルの下)に格納されているため、以下の設定ではt2.timeになります。

だから私の問題は、どうすればいいのかわからないということです。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

11
newbtophp

from_unixtime いいね

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

しかし、データ型integerはこの要件にはあまり適していないと思います

datetimeを使用する方が適切だと思います。この列にインデックスを作成すると、次のようにフィルタリングも簡単になります。

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

または

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

YEAR() および MONTH()functions を使用して、結果を制限する必要があります。クエリのWHERE部分を次のように変更します。

WHERE t1.website != ''
AND YEAR(time) = YEAR(NOW())
AND MONTH(time) = MONTH(NOW())
66
Anax
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()関数を使用して、作成した日時の上限と下限を変換できます。

2
goat

これはおそらく、予想よりもはるかに簡単です。

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 
2
Ryan Gooler

パフォーマンスを向上させるには(->インデックスを使用)、日付列にインデックスを作成し、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);
0
Cedric Simon