2012-12-14 32 views
0

我在社区论坛上有一个“喜欢”系统。所有内部喜欢都存储在一个名为log_like的数据库中。MySQL - 在过去一个月内获得最“喜欢”的用户

CREATE TABLE `log_like` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_member` mediumint(8) NOT NULL, 
    `id_message` int(10) NOT NULL, 
    `id_poster` mediumint(8) NOT NULL DEFAULT '0', 
    `time` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `id_member` (`id_member`), 
    KEY `id_message` (`id_message`) 
) ENGINE=MyISAM; 

我需要得到上个月最喜欢的成员ID(上面DDL中的id_poster字段)。所以我可能需要GROUP和COUNT在过去的月份的记录中出现相同的“id_poster”多少次。我想限制它到最喜欢的10个。字段“time”存储unix时间以供参考。

不幸的是,我不知道如何做到这一点。谁能帮忙?

回答

1

所以,这里是我结束了:

SELECT 
    id_poster, 
    COUNT(1) AS like_count 
FROM 
    log_like 
WHERE 
    time BETWEEN UNIX_TIMESTAMP('2012-11-01') AND UNIX_TIMESTAMP('2012-12-01') 
GROUP BY 
    id_poster 
ORDER BY 
    like_count 
DESC 
LIMIT 10 

这样,我得到过去的一个月(2012年11月)顶部的结果,而不是过去的30天,从现在像以前建议。 (非常感谢Barmar所有的工作)

1
select id_poster, count(*) like_count 
from log_like 
where time > unix_timestamp(date_sub(now(), interval 1 month)) 
group by id_poster 
order by like_count desc 
limit 10 

如果您在id_poster上有索引,这将是最好的。

+0

非常感谢。但是,我假设date_sub()基于MySQL日期,并且我在Unix时间戳(自epoch以来的秒数)中有时间参考。因此,我的MySQL查询没有结果。 – BornKillaz

+0

我添加了'unix_timestamp()'函数。你自己也无法弄清楚这一点吗? – Barmar

+0

是的,在我回复之后,我添加了UNIX_TIMESTAMP(),因为我的时间字段位于unix时间戳记(自epoch以来的秒数)。但是,我没有得到每个顶级成员的喜欢SUM,而是在结果集中得到整数“1”。我想汇总每个成员,换句话说,数据库中引用前10位id_poster的次数(一行等于一个)。 – BornKillaz

0
SELECT DISTINCT id, count(*) as '#oflikes' from log_like 
WHERE 
    time BETWEEN UNIX_TIMESTAMP('2012-11-01') AND UNIX_TIMESTAMP('2012-12-01') 
LIMIT 10; 
相关问题