Php 分组和排序问题

Php 分组和排序问题,php,mysql,group-by,Php,Mysql,Group By,我有一个通知系统(基于PHP、MySQL),我正在尝试执行以下操作: 查询通知结果按帖子分组,没有任何限制,但按发送时间排序,限制为5次(每次迭代)。 然后,我使用ajax来显示下一个迭代集(共5个通知) 基本上,我一次需要5个通知(每套),但对于每个通知,如果一个组涉及一个帖子:可以有任意多个通知: 这是显示的方式: 关于F后的通知–1天前发送 关于C后的第一次通知–2天前发送 关于C后的第二次通知–3天前发送 关于C后的第三次通知-4天前发送 关于C后的第四次通知——5天前发送 关于邮政

我有一个通知系统(基于PHP、MySQL),我正在尝试执行以下操作: 查询通知结果按帖子分组,没有任何限制,但按发送时间排序,限制为5次(每次迭代)。 然后,我使用ajax来显示下一个迭代集(共5个通知)

基本上,我一次需要5个通知(每套),但对于每个通知,如果一个组涉及一个帖子:可以有任意多个通知:

这是显示的方式:

  • 关于F后的通知–1天前发送
  • 关于C后的第一次通知–2天前发送
    • 关于C后的第二次通知–3天前发送
    • 关于C后的第三次通知-4天前发送
    • 关于C后的第四次通知——5天前发送
  • 关于邮政Y的通知–3天前发送
  • 关于D后的第一次通知–4天前发送
    • 关于D后的第二次通知-5天前发送
    • 关于D后的第三次通知–6天前发送
  • 关于邮政Y的通知–5天前发送
  • 如果发送了关于post Y的新通知,则该通知自然会上升到列表的顶部

    这就是我在决定实施该小组系统之前的开始:

    $notifications_req = mysql_query('SELECT * FROM notifications WHERE user_id = "'.$user_id.'" ORDER BY time_sent DESC LIMIT 5');
    
    现在我迷路了,和这群人按照逻辑和秩序斗争

    数据库当然包含一个
    post\u id

    编辑:

    我最终彻底改变了我想要的通知方式。我最终就是这样做的。它可能不是最有效的,但它的工作方式符合我的要求:

    <?php  $notifications_all_req = mysql_query('SELECT * FROM notifications WHERE user_id = "'.$user_id.'" ORDER BY time_sent DESC');  if(mysql_num_rows($notifications_all_req) > 0){
    while($row =  mysql_fetch_assoc($notifications_all_req))
    {
        $post_req_ids[] = $row['post_id'];
    }
    $unique_post_ids = array_unique($post_req_ids);
    foreach ($unique_post_ids as $i => $unique_post_id)
    {
        ?>      
        <ul id="notifications_ul_<?php echo $i; ?>">
        <?php
        $notifications_req = mysql_query('SELECT * FROM notifications WHERE (user_id = "'.$user_id.'" AND post_id = "'.$unique_post_id.'") ORDER BY time_sent DESC ');
            while($notification =  mysql_fetch_assoc($notifications_req))
            {
    
            }
            ?>
        </ul>
        <?php
    }  }  ?>
    

    您不想在这里使用
    分组依据
    ,因为这是用于摘要查询的

    专业提示:不要使用
    选择*
    。而是按名称选择所需的列

    专业提示:人们建议你使用PDO或mysqli_uu有一个很好的理由。众所周知,mysql接口不安全。如果你把一个基于mysql的web应用放在公共网络上,一些坏蛋会攻击你。如果你不介意被pwned,例如,如果你正在建立一个原型或概念验证网站,不要担心

    在我们开始将结果集划分为五个帖子块之前,让我们先对结果集进行排序。在
    orderby
    子句中需要两个项目。似乎您希望结果集按如下顺序排列

    SELECT * 
      FROM notifications 
     WHERE user_id = ? 
     ORDER BY post_id, time_sent DESC
    
    SELECT * 
      FROM notifications 
     WHERE post_id IN (
                          SELECT DISTINCT post_id
                            FROM notifications
                           WHERE user_id = ?
                           ORDER BY post_id
                           LIMIT 5 OFFSET ?   
                      ) 
     ORDER BY post_id, time_sent DESC
    
    尝试一下,不要使用
    限制5
    ,并调试php代码,以便获得良好的显示效果,即使它对于您的目的来说太长

    接下来,如果我没弄错的话,你试图一次显示五篇文章。这会变得更加棘手,因为您需要五篇文章,而每一篇文章都可以有不同数量的通知

    因此,我们必须想出一种方法,一次获得五个职位。这个子查询将提供一个包含五个post_id值的列表

     SELECT DISTINCT post_id
       FROM notifications
      WHERE user_id = ?
      ORDER BY post_id
      LIMIT 5 OFFSET ?   
    
    OFFSET?
    的参数应该是0、5、10等等,以获得第一、第二、第三等五个帖子。如果您只需要前五篇文章,只需省略
    OFFSET
    子句

    现在,我们必须在另一个查询中嵌入仅获取五篇文章的子查询,以获取所有数据。就是这样

    SELECT * 
      FROM notifications 
     WHERE user_id = ? 
     ORDER BY post_id, time_sent DESC
    
    SELECT * 
      FROM notifications 
     WHERE post_id IN (
                          SELECT DISTINCT post_id
                            FROM notifications
                           WHERE user_id = ?
                           ORDER BY post_id
                           LIMIT 5 OFFSET ?   
                      ) 
     ORDER BY post_id, time_sent DESC
    

    最后一个更复杂的SQL查询将提供一个与第一条语句中的结果集类似的结果集。您应该能够将其插入到已调试的php代码中,并获得所需的显示。

    您不希望在此处使用
    分组方式,因为这是用于摘要查询的

    专业提示:不要使用
    选择*
    。而是按名称选择所需的列

    专业提示:人们建议你使用PDO或mysqli_uu有一个很好的理由。众所周知,mysql接口不安全。如果你把一个基于mysql的web应用放在公共网络上,一些坏蛋会攻击你。如果你不介意被pwned,例如,如果你正在建立一个原型或概念验证网站,不要担心

    在我们开始将结果集划分为五个帖子块之前,让我们先对结果集进行排序。在
    orderby
    子句中需要两个项目。似乎您希望结果集按如下顺序排列

    SELECT * 
      FROM notifications 
     WHERE user_id = ? 
     ORDER BY post_id, time_sent DESC
    
    SELECT * 
      FROM notifications 
     WHERE post_id IN (
                          SELECT DISTINCT post_id
                            FROM notifications
                           WHERE user_id = ?
                           ORDER BY post_id
                           LIMIT 5 OFFSET ?   
                      ) 
     ORDER BY post_id, time_sent DESC
    
    尝试一下,不要使用
    限制5
    ,并调试php代码,以便获得良好的显示效果,即使它对于您的目的来说太长

    接下来,如果我没弄错的话,你试图一次显示五篇文章。这会变得更加棘手,因为您需要五篇文章,而每一篇文章都可以有不同数量的通知

    因此,我们必须想出一种方法,一次获得五个职位。这个子查询将提供一个包含五个post_id值的列表

     SELECT DISTINCT post_id
       FROM notifications
      WHERE user_id = ?
      ORDER BY post_id
      LIMIT 5 OFFSET ?   
    
    OFFSET?
    的参数应该是0、5、10等等,以获得第一、第二、第三等五个帖子。如果您只需要前五篇文章,只需省略
    OFFSET
    子句

    现在,我们必须在另一个查询中嵌入仅获取五篇文章的子查询,以获取所有数据。就是这样

    SELECT * 
      FROM notifications 
     WHERE user_id = ? 
     ORDER BY post_id, time_sent DESC
    
    SELECT * 
      FROM notifications 
     WHERE post_id IN (
                          SELECT DISTINCT post_id
                            FROM notifications
                           WHERE user_id = ?
                           ORDER BY post_id
                           LIMIT 5 OFFSET ?   
                      ) 
     ORDER BY post_id, time_sent DESC
    

    最后一个更复杂的SQL查询将提供一个与第一条语句中的结果集类似的结果集。您应该能够将其插入到已调试的php代码中,并获得所需的显示。

    来吧。只要多做一点研究工作,你就能做得更好。如果你刚刚开始,现在将是研究PDO的好时机,或者,至少,用mysqli_uu代替这个不推荐的方法。PDO或mysqli将迫使我改变我的整个网站。也许是下一个。我试过:$notifications_req=mysql_query('SELECT*FROM(SELECT*FROM notifications WHERE user_id=“”。$user_id.”“ORDER BY time_sent DESC LIMIT 0,5)AS x GROUP BY post_id”);但它失败了我想我是用2 ORDER BY:$notifications_req=mysql_query('SELECT*FROM(SELECT*FROM notifications WHERE user_id=“”).$user_id.”按时间排序发送描述限制0,5)作为x ORD得到的