2013-01-16 51 views
0

我有一个下db表review_voteMySQL查询获得最高票perday

review_id | user_id | status | date_added 
2    3  good  20130116135259 
3    3  normal 20130116145259 
4    2  normal 20130116155259 
5    2  good  20130116165259 
6    2  good  20130116175259 
7    1  great 20130116185259 
8    3  good  20130117135259 
9    3  normal 20130117145259 

目前我可以用下面的查询最高投票:

SELECT review_id FROM review_vote GROUP BY review_id HAVING COUNT(*) = 
(
    SELECT MAX(x.counts) FROM 
    ( 
     SELECT review_id, COUNT(*) counts FROM review_vote GROUP BY review_id 
    )x 
) 
order by date_added desc 

,但如果我需要得到最高每天投票如何修改上面的代码?这意味着如果今天是2013-01-16我需要得到昨天的最高票数2013-01-15

我试图使用date_added = CURDATE()失败。 SQLFIDDLE:http://sqlfiddle.com/#!2/9a2b5/6

更新查询:

CREATE TABLE IF NOT EXISTS `review_vote` (
    `review_id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `status` varchar(100) NOT NULL, 
    `date_added` varchar(100) NOT NULL, 
    KEY `review_id` (`review_id`,`user_id`) USING BTREE 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 



INSERT INTO `review_vote` (`review_id`, `user_id`, `status`, `date_added`) VALUES 
(223, 2, 'lame', '20130116195259'); 
INSERT INTO `review_vote` (`review_id`, `user_id`, `status`, `date_added`) VALUES(222, 2, 'lame', '20130115195259'); 
+0

如果您每天需要,那么您还需要按天分组 – bonCodigo

回答

0
SELECT review_id 
FROM  review_vote 
WHERE date_added LIKE '20130115%' 
GROUP BY review_id 
ORDER BY COUNT(*) DESC 
LIMIT 1 

但你真的应该考虑改变你date_added列到合适的时间类型,像DATETIME or TIMESTAMP

1

在这里的条件就补充一点:

DATE_FORMAT(date_added, '%Y-%m-%d') = CURDATE() 

更新按你的错误

SELECT review_id FROM review_vote AS RV WHERE DATE_FORMAT(RV.date_added, '%Y-%m-%d') = CURDATE()  
    GROUP BY review_id HAVING COUNT() = 
(
    SELECT MAX(x.counts) FROM 
    (
     SELECT review_id, COUNT() counts FROM review_vote GROUP BY review_id 
    )x 
) 

请看看演示:demo

+0

错误您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第10行'WHERE'date_added' DATE_FORMAT(date_added,'%Y-%m-%d')= CURDATE()'处使用正确的语法:SELECT review_id FROM review_vote GROUP BY review_id HAVING COUNT(*)=(SELECT MAX(x.counts)FROM(SELECT review_id,COUNT(*)counts FROM review_vote GROUP BY review_id)x)WHERE'date_added' DATE_FORMAT(date_added,'%Y-%m- %d')= CURDATE() –

+0

@SaraswathiApavoo:您的查询错误只是根据我的文章更新。 –

+0

你确定它有效..?我只是复制你的代码在sqlfiddle它仍然显示错误 –

0

以下内容添加到您的WHERE子句:

`date_added` BETWEEN 
    DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), '%Y%m%d') 
    AND DATE_FORMAT(CURDATE(), '%Y%m%d') 

确保你有一个索引date_added

的日期函数

文档是一切都在这里:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

生活会为你更容易,如果你date_added列是一个本地日期类型。

+0

我尝试过,但仍然不能很好地工作。看看sqlfiddle –

+0

你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第10行的'WHERE'date_added' BETWEEN DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL 1 DAY),'%Y'附近使用正确的语法:SELECT review_id FROM review_vote GROUP BY review_id HAVING COUNT(*)=(SELECT MAX(x。(DATE_SUB(CURDATE(),INTERVAL 1 DAY),'%Y%m%d')AND DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL 1 DAY))DATE_FORMAT CURDATE(),'%​​Y%m%d') –

+0

你的'WHERE'在错误的地方,它应该在'FROM'之后。 – BenLanc