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