有没有办法检查结果是表中的最后一个(最高ID)?

时间:2015-10-11 09:52:54

标签: php mysql

我有一个用于显示博客帖子的页面。在页面的开头,为了获取我使用以下SQL的数据:

SELECT posts.*, count(comments.post_id) as number_of_comments from posts left     join comments on (posts.post_id = comments.post_id) WHERE post_url LIKE '$post_url' group by posts.post_id

我在页面末尾添加了一个按钮,以“阅读下一篇文章”,按下该按钮后,会找到当前显示的帖子的ID,然后从db获取下一篇文章:

$(".readNext").click(function(){
    var result = "";
    var postID = "postID=" + $(".post").attr("id");
    $.get("/retrieveNextPost", postID, function (data) {
        //SomeFunction(data);
        window.location = '/blog/' + data;
    });
});

<?php
include('dbconnect.php');

if (isset($_GET['postID']))
{
    $post_id = $_GET['postID'];
}

$SQL = "SELECT posts.*, count(comments.post_id) as number_of_comments from posts left join comments on (posts.post_id = comments.post_id) WHERE posts.post_id > $post_id group by posts.post_id ORDER BY post_id ASC LIMIT 0, 1";
$result = mysqli_query($link, $SQL);
$row = mysqli_fetch_array($result);
echo $row['post_url'];
?>

这很有效 - 直到你到达最后一篇(最新/最高ID)博客文章。此时 - 我想完全从页面中删除按钮。因为显示它没有意义。

有没有办法修改页面顶部的SQL以标记某种Y / N标志,如果为true,我可以用它来隐藏按钮?

即。如果当前博客帖子记录是表格中的最后一个/最高ID,则将flag设置为true。

4 个答案:

答案 0 :(得分:0)

您可以向包含最大post_id的帖子添加另一个左连接。如果这匹配(不为空)那么你就是最高职位。

脱离我的头顶:

SELECT posts.*,
    count(comments.post_id) as number_of_comments,
    -- if post_id matches then is highest
    case when maxPosts.post_id is not null then 1 else 0 end as IsLast
from posts
left join comments on (posts.post_id = comments.post_id)
left join (
    -- get max post_id and join on current post_id
    select post_id from posts order by post_id desc Limit 1
) maxPosts on post.post_id = maxPosts.post_id
WHERE post_url LIKE '$post_url' group by posts.post_id

答案 1 :(得分:0)

你可以在mysql查询中使用limit和descending。

SELECT * FROM yourtable ORDER BY id DESC LIMIT 1

将限制设置为1将允许您获得1个结果。并使用desc将id从最高到最低排序

答案 2 :(得分:0)

您可以在选择查询中添加MAX(posts.post_id),并检查当前帖子是否为最后一个。

SELECT 
    posts.*, MAX(posts.post_id) as last_post, 
    count(comments.post_id) as number_of_comments 
FROM posts 
LEFT JOIN comments on (posts.post_id = comments.post_id) 
WHERE post_url LIKE '$post_url' 
GROUP BY posts.post_id

然后在php中将输出返回为json

$row = mysqli_fetch_array($result);
if ($row['post_id'] == $row['last_post']) $last = true;
else $last = false;

header('Content-Type: application/json');
echo json_encode( array(
        'url'=>$row['post_url'],
        'isLast' => $last
        )
);

在javascript部分中使用json,测试你是否已经到达最后一个帖子,如果是,则只需删除按钮。

$(".readNext").click(function(){
    var result = "";
    var postID = "postID=" + $(".post").attr("id");
    $.get("/retrieveNextPost", postID, function (data) {
        if (data.isLast == true) $(this).remove();
        else window.location = '/blog/' + data.url;
    });
});

答案 3 :(得分:0)

在上述帖子之上,您可以使用LIMIT&amp;获取最新一行。查询中的DESC还有其他方法可以简化它。

例如:

PDO:您可以访问lastInsertId();返回行的最新id的函数。

MySQLi:在你的情况下,我相信你正在使用MySQLi,所以你可以使用mysqli_insert_id()函数,它的工作方式与上面的PDO函数类似。