我在我的应用中排名前十位,而且我已经陷入了我将要使用的SQL查询中。 我有2张桌子。 '帖子' table存储post autor的ID(user_id)和post内容(当然还有条目ID)。
t=# create table so43 (i int);
CREATE TABLE
t=# insert into so43 select 1;
INSERT 0 1
t=# select * from dblink('dbname = t',format('delete from so43 where i <= %s',1)) as row(result text);
result
----------
DELETE 1
(1 row)
&#39;喜欢&#39; table,store喜欢帖子的人的ID(user_id),帖子ID(post_id)等日期女巫是时间戳(like_date)。
+----+---------+--------------+
| ID | user_id | content |
+----+---------+--------------+
| 1 | 3 | Lorem Ipsum1 |
| 2 | 6 | Lorem Ipsum2 |
| 3 | 3 | Lorem Ipsum3 |
+----+---------+--------------+
每当用户喜欢帖子时,就会在“喜欢”中创建一个条目。表,如果用户不同,我只是删除条目。 而这就是这笔交易。我想抓住过去30天里最受欢迎的十大用户。我希望查询结果是这样的
+----+---------+---------+------------+
| ID | user_id | post_id | like_date |
+----+---------+---------+------------+
| 1 | 2 | 1 | 1491484851 |
| 2 | 5 | 1 | 1491484871 |
| 3 | 11 | 2 | 1491484891 |
+----+---------+---------+------------+
我已经尝试了大量的查询,花了几个小时试图解决这个问题,但我只是想弄清楚如何。
答案 0 :(得分:0)
假设您的预期结果中的“post_id”而不是“user_id”:
SELECT post_id, count(*) as 'likes'
FROM likes
GROUP BY post_id
WHERE like_date >= DATE(NOW() - INTERVAL 30 DAY)
ORDER By 2 desc
LIMIT 10
所有内容都在like表中,因此过滤最近的帖子(WHERE),按计数返回/排序,并检索前10行。还有其他方法可以实现这一目标......
答案 1 :(得分:0)
这个应该做的伎俩
select user_id, count(*)
from posts t1
join likes t2
on t1.ID = t2.post_id
where from_unixtime(t2.like_date) >= now() - interval 30 day
group by user_id
order by count(*) desc
limit 10
答案 2 :(得分:0)
您甚至不需要join
:
SELECT user_id, count(*) as numlikes
FROM likes l
WHERE like_date >= unix_timestamp() - 30*24*60*60
GROUP BY user_id
ORDER BY numlikes desc
LIMIT 10;
like_date
看起来像是一个Unix时间戳,所以我们应该将它视为一个。这从当前时间到第二天正好30天。如果你想计算午夜的天数:
WHERE like_date >= unix_timestamp(CURDATE() - interval 30 day)
编辑:
如果是帖子中的user_id
,那么您可以使用join
来获取该内容:
SELECT p.user_id, count(*) as numlikes
FROM likes l join
posts p
on l.post_id = p.id
WHERE l.like_date >= unix_timestamp() - 30*24*60*60
GROUP BY p.user_id
ORDER BY numlikes desc
LIMIT 10;