排序SQL查询

时间:2017-04-06 13:30:34

标签: php mysql sql ranking

我在我的应用中排名前十位,而且我已经陷入了我将要使用的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 |
+----+---------+---------+------------+

我已经尝试了大量的查询,花了几个小时试图解决这个问题,但我只是想弄清楚如何。

3 个答案:

答案 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;