2017-04-06 95 views
-1

我在我的应用程序中做了前十名的排名,而且我被困在SQL查询中,我将用它来做这件事。 我有2张桌子。 'posts'表中存储了帖子创作者(user_id)的ID和帖子内容(当然还有条目ID)。排名SQL查询

+----+---------+--------------+ 
| ID | user_id | content | 
+----+---------+--------------+ 
| 1 |  3 | Lorem Ipsum1 | 
| 2 |  6 | Lorem Ipsum2 | 
| 3 |  3 | Lorem Ipsum3 | 
+----+---------+--------------+ 

的“喜欢”表,谁喜欢的职位(USER_ID)的人的店铺ID,后ID(POST_ID)等日期女巫是一个时间戳(like_date)。

+----+---------+---------+------------+ 
| ID | user_id | post_id | like_date | 
+----+---------+---------+------------+ 
| 1 |  2 |  1 | 1491484851 | 
| 2 |  5 |  1 | 1491484871 | 
| 3 |  11 |  2 | 1491484891 | 
+----+---------+---------+------------+ 

每当用户喜欢帖子,在'喜欢'表创建一个条目,并且如果用户不同,我只是删除条目。 这是交易。我想抓住过去30天中最受欢迎的10位用户。我想查询结果是这样的

+---------+-------+ 
| user_id | likes | 
+---------+-------+ 
|  3 |  2 | 
|  6 |  1 | 
+---------+-------+ 

我已经试过吨查询,并花了几个小时试图解决这个问题,但我只是无法弄清楚如何。

+1

首先,显示你的努力。然后,你写出“前10名最喜欢的帖子”,但你的示例输出显示“user_id”......你想要哪一个? –

+0

对不起。我的意思是“用户”。 –

+1

你到目前为止提出了什么? – blackandorangecat

回答

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 

一切都在喜欢表,所以过滤柱(WHERE)由计数,返回/秩序和ONL检索前10行。还有其他的方法来实现这一目标?

+0

是的,我想我只需要得到这个结果并按照帖子的作者总结 –

+0

在这种情况下,Stefano的钉了它.. –

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 
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; 
+0

这会带来用户给出的喜欢的总数,不会? 我在寻找用户在那段时间收到的喜欢总数 –