有没有一种方法可以改进此SQL查询以特定顺序检索数据?

时间:2019-08-28 19:41:23

标签: mysql sql database

我有一个包含以下2个表的数据库

帖子:

|post_id| text |post_date(time_stamp)|

顶:

| like_id | likee (1 or -1) | post_id | like_date (time_stamp) |

我正在尝试恢复过去一个小时内所有喜欢的帖子,并按过去一个小时内收到的喜欢数量对其进行排序。

我尝试了以下查询,该查询返回了过去一个小时内所有喜欢的帖子,但是我无法根据每个post_id的喜欢总和来确定排序方式。

SELECT * FROM posts
  INNER JOIN likes ON posts.post_id = likes.post_id
  WHERE TIMESTAMPDIFF(HOUR,like_time,NOW())< 1 AND likee= 1

我可以通过修改查询来实现它吗?

2 个答案:

答案 0 :(得分:2)

首先计算最后一个小时的喜欢(或正面喜欢):

 SELECT post_id, 
        SUM( likee ) as total_likes,
        SUM( CASE WHEN likee = 1 THEN 1 ELSE 0 END ) as total_positive_likes
 FROM likes
 WHERE like_date >= DATE_SUB(NOW(),INTERVAL 1 HOUR)
 GROUP BY post_id; 

请注意,您无需更改字段like_date,而是从NOW()创建一个可以使用索引的常量。

现在,您以总的赞数加入您的帖子

SELECT p.*, l.total_likes
FROM Post p 
JOIN ( SELECT post_id, 
              SUM( likee ) as total_likes,
              SUM( CASE WHEN likee = 1 THEN 1 ELSE 0 END ) as total_positive_likes
       FROM likes
       WHERE like_date >= DATE_SUB(NOW(),INTERVAL 1 HOUR)
       GROUP BY post_id
    ) L
  ON p.post_id = l.post_id
ORDER BY l.total_likes DESC

答案 1 :(得分:-1)

SELECT * FROM posts
INNER JOIN likes ON posts.post_id = likes.post_id
WHERE TIMESTAMPDIFF(HOUR,like_time,NOW())< 1 AND likee= 1
ORDER BY likee DESC

您可以使用ORDER BY语句执行此操作。 @ {Mysql basics