gpt4 book ai didi

php - 分组和排序问题

转载 作者:行者123 更新时间:2023-11-29 00:24:23 24 4
gpt4 key购买 nike

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

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

这是将如何显示:

  1. 关于帖子 F 的通知 – 1 天前发送
  2. 关于帖子 C 的第一个通知 – 2 天前发送
    • 关于帖子 C 的第二次通知 – 3 天前发送
    • 关于帖子 C 的第三次通知 – 4 天前发送
    • 关于帖子 C 的第四次通知 – 5 天前发送
  3. 关于帖子 Y 的通知 – 3 天前发送
  4. 关于帖子 D 的第一个通知 – 4 天前发送
    • 关于 Post D 的第二次通知 – 5 天前发送
    • 关于帖子 D 的第三次通知 – 6 天前发送
  5. 关于帖子 Y 的通知 – 5 天前发送

如果发送了关于帖子 Y 的新通知,它自然会被提升到列表的顶部。

在我决定实现这个群组系统之前,我是这样开始的:

$notifications_req = mysql_query('SELECT * FROM notifications WHERE user_id = "'.$user_id.'" ORDER BY time_sent DESC LIMIT 5');

现在我迷路了,并在这个按逻辑排序的群体中挣扎。

数据库当然包含一个 post_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
} } ?>

这样,我可以控制通知组(使用 $i)和每个组内通知组的限制,还可以使用 Ajax 为后者加载更多代码。

最佳答案

您不想在这里使用 GROUP BY,因为那是用于汇总查询。

专业提示:不要使用 SELECT *。相反,按名称选择所需的列。

专业提示:人们建议您使用 PDO 或 mysqli_ 是有充分理由的。 mysql_ 接口(interface)是出了名的不安全。如果您将基于 mysql_ 的 Web 应用程序放在公共(public)网络上,一些坏人攻击您。如果您不介意被打脸,例如,如果您正在构建原型(prototype)或概念验证网站,请不要担心。

在开始将结果集分成五个帖子 block 之前,让我们对结果集进行排序。您的 ORDER BY 子句中需要两个项目。您似乎希望您的结果集像这样排序。

SELECT * 
FROM notifications
WHERE user_id = ?
ORDER BY post_id, time_sent DESC

试一试,不要使用 LIMIT 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 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 代码并获得您正在寻找的显示。

关于php - 分组和排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com