次の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
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')
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()関数を使用して、作成した日時の上限と下限を変換できます。
これはおそらく、予想よりもはるかに簡単です。
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
パフォーマンスを向上させるには(->インデックスを使用)、日付列にインデックスを作成し、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);