2011-01-11 62 views
11

我有以下MySQL查询,和我想要所以只取得成果,这是当月内(当年的)来调整它,我猜你可能需要更多的信息关于我的MySQL结构,所以在这里它去 - 我有存储在time列(referrals桌下)在PHP中的time()产生一个UNIX时间戳,所以用下面的设置这将是t2.timeMySQL仅在当前月份内?

所以我的问题是我不能确定如何进行,我猜它会是这样的添加结束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 

感谢所有帮助! :乙

+0

您是否知道数据类型`time`不存储年份和月份的详细信息?这意味着你的应用程序将在2012年遇到问题 – ajreal 2011-01-11 07:06:42

+0

@ajreal我不知道我理解你,但类型是数据库中的INT,并且它是由time()生成的UNIX时间戳。 – newbtophp 2011-01-11 07:08:05

+0

所以不是数据类型`time`?我不好,在所有成本,避免使用保留的关键字作为列或表 – ajreal 2011-01-11 07:11:05

回答

13

可以使用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') 
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函数。

您可以像MONTH(FROM_UNIXTIME(t2.time)) = Month(NOW())

fireeyedboy获取帮助的意见后编辑添加的条件。

66

您需要使用YEAR()MONTH()functions限制结果。更改您的查询的WHERE部分是这样的:

WHERE t1.website != '' 
AND YEAR(time) = YEAR(NOW()) 
AND MONTH(time) = MONTH(NOW()) 
2
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子句中创建“之间”你的日期栏和用户的索引。

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); 
相关问题