2011-01-11 56 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); 
相關問題