Mysql 在过去x小时内按评论数排序帖子

Mysql 在过去x小时内按评论数排序帖子,mysql,sql,Mysql,Sql,我有这段代码,这是我想要的,但它仍然缺少一些东西: <?php $hours = 12; $result = $wpdb->get_results( $wpdb->prepare( " SELECT p.comment_count, p.ID, p.post_title FROM $wpdb->posts p INNER JOIN $wpdb->comments c ON c.comment_post_I

我有这段代码,这是我想要的,但它仍然缺少一些东西:

    <?php 
    $hours = 12;

    $result = $wpdb->get_results( $wpdb->prepare( "
    SELECT p.comment_count, p.ID, p.post_title
    FROM $wpdb->posts p
    INNER JOIN $wpdb->comments c ON c.comment_post_ID = p.ID
    WHERE p.post_type = 'post'
    AND p.post_status = 'publish'
    AND ( TIMESTAMPDIFF( HOUR, c.comment_date, NOW() ) <= %d )
    GROUP BY p.ID
    ORDER BY p.comment_count DESC
    LIMIT 0, 6
    ", $hours ) );
        
        
         foreach ($result as $topten) {
             $postid = $topten->ID;
             $title = $topten->post_title;
             $commentcount = $topten->comment_count;
             if ($commentcount != 0) {
      ?>  
理论上,它们应该按上述顺序排列

然而,有趣的是

即使Grape有2条评论,并且应该是最后一条,但由于它的评论一直最多,所以它会排在第一位:

Grape (2 comments), 
Apple (10 comments), 
Orange (8 comments) and etc. 
这是不正确的

基本上,苹果是否有10条评论并不重要,只要你在Grape帖子中写下至少1条评论,它就会把Grape放在第一位

换言之,上面的代码不知何故知道哪些水果有最多的注释,并将它们按顺序排列,而不管您设置的时间范围以及在这段时间内它收到了多少注释

其他所有评论最多的帖子也是如此

假设所有时间都是这样:

Grape (300 comments), 
Lemon (200 comments), 
Cherry (200 comments)
根据上述代码,如果在过去12小时内收到:

Apple (10 comments), 
Orange (8 comments), 
Banana (7 comments), 
Cherry (5 comments), 
Lemon (3 comments), 
Grape (2 comments).
Cherry (3 comments), 
Lemon (2 comments), 
Grape (1 comment), 
Apple (30 comments), 
Orange (20 comments).
它的顺序如下:

Grape,  
Lemon, 
Cherry, 
all other depending on the ALL TIME.
尽管如此,苹果应该是第一个进入这一行列的公司

我希望我解释得很清楚

我知道我在代码的某个地方犯了错误

我不是编码员


非常需要帮助。

你想要在过去12小时内评论最多的6篇帖子。用于或存在于此

您希望按帖子的总评论数排序帖子。您可以按子查询排序

SELECT p.comment_count, p.id, p.post_title
FROM posts p
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
AND p.id IN
(
  SELECT c.comment_post_id
  FROM comments c
  WHERE TIMESTAMPDIFF( HOUR, c.comment_date, NOW() ) <= 12
  GROUP BY c.comment_post_id
  ORDER BY COUNT(*) DESC
  LIMIT 6
)
ORDER BY
(
  SELECT COALESCE(COUNT(*), 0)
  FROM comments c
  WHERE c.comment_post_id = p.id
) DESC;
在PHP脚本中,可能会出现以下情况:

$result = $wpdb->get_results( $wpdb->prepare( "
SELECT p.comment_count, p.id, p.post_title
FROM posts p
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
AND p.id IN
(
  SELECT top6_and_ties.comment_post_id
  FROM comments top6_and_ties
  WHERE TIMESTAMPDIFF( HOUR, top6_and_ties.comment_date, NOW() ) <= %d
  GROUP BY top6_and_ties.comment_post_id
  HAVING COUNT(*) IN
  (
    SELECT COUNT(*)
    FROM comments top6_counts
    WHERE TIMESTAMPDIFF( HOUR, top6_counts.comment_date, NOW() ) <= %d
    GROUP BY top6_counts.comment_post_id
    ORDER BY COUNT(*) DESC
    LIMIT 6
  )
)
ORDER BY
(
  SELECT COALESCE(COUNT(*), 0)
  FROM comments c
  WHERE c.comment_post_id = p.id
) DESC
", $hours , $hours ) );

那么,你只想显示过去12小时内收到评论的帖子?在所有这些帖子中,你想显示数据库中评论最多的六篇吗?领带呢?如果你有葡萄300、柠檬200、樱桃200、苹果200、草莓200、桃子100和香蕉100,你会展示桃子和香蕉,还是任意挑选其中一种,或者只展示五种水果?你的数据库管理系统是什么?当问SQL问题时,这是关于SQL的问题,而不是关于php的问题,也不是关于数据库的问题,你应该用你正在使用的数据库管理系统来标记请求。是的,显示6篇文章,并按人气排序——在过去12小时内得到最多评论的人。至于领带,请同时展示桃子和香蕉,但顺序并不重要。它们可以在两个地方之间旋转。对不起,什么是数据库管理系统?谢谢你的评论。例如,DBMS就是MySQL。或SQL Server。或者甲骨文。或者PostgreSQL。您现在标记了mysql,所以您显然正在使用mysql:-您使用的是哪个版本?MySQL 8.MySQL版本:5.6.47这是一个非常旧的版本,甚至不再受支持。考虑升级到MySQL 8。我不是一个编码器,可以简单地粘贴代码吗?就像上面我的一样。我试着把你的代码放进我的代码里,结果出错了。我不知道该把它放在哪里。起点在哪里,终点在哪里。我的代码中是否还有任何部分是必需的。。。提前谢谢Thorsten。我不怎么使用PHP。我已经编辑了我的答案,希望这能奏效。当然,我的代码中可能有错误。如果你不是一个编码员,那么你为什么要编码?
$result = $wpdb->get_results( $wpdb->prepare( "
SELECT p.comment_count, p.id, p.post_title
FROM posts p
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
AND p.id IN
(
  SELECT top6_and_ties.comment_post_id
  FROM comments top6_and_ties
  WHERE TIMESTAMPDIFF( HOUR, top6_and_ties.comment_date, NOW() ) <= %d
  GROUP BY top6_and_ties.comment_post_id
  HAVING COUNT(*) IN
  (
    SELECT COUNT(*)
    FROM comments top6_counts
    WHERE TIMESTAMPDIFF( HOUR, top6_counts.comment_date, NOW() ) <= %d
    GROUP BY top6_counts.comment_post_id
    ORDER BY COUNT(*) DESC
    LIMIT 6
  )
)
ORDER BY
(
  SELECT COALESCE(COUNT(*), 0)
  FROM comments c
  WHERE c.comment_post_id = p.id
) DESC
", $hours , $hours ) );