【问题标题】:MYSQL select last 3 rows, order by ASCMYSQL 选择最后 3 行,按 ASC 排序
【发布时间】:2012-02-12 01:06:54
【问题描述】:

我只想选择帖子中最新的 3 个 cmets,并按 ASC 顺序排列。

这会选择最后 3 行,但是我需要它们以相反的顺序:

mysql_query("
SELECT * FROM comments WHERE postID='$id' AND state='0' ORDER BY id DESC LIMIT 3")

【问题讨论】:

    标签: php mysql select sql-order-by


    【解决方案1】:

    您可以稍后对其进行反向排序。

    SELECT * 
    FROM (SELECT * FROM comments
          WHERE postID='$id' 
            AND state='0' 
          ORDER BY id DESC 
          LIMIT 3) t
    ORDER BY id ASC;
    

    【讨论】:

    • 不建议使用*,提全项更快
    • @MarcAlexander:只是给子查询一个名字,就好像它是一个真实的表一样。此处未使用,但这是一个好习惯(恕我直言)。
    • 这很有帮助,但我如何在我拥有的这个 php 函数中做到这一点:code $tblNews_new = new Tbl('last_news'); $newseObject = $tblNews_new->Find([['tbl'=>'last_news','field'=>'news_type','value'=>'1']]); foreach($newseObject as $item):code`
    【解决方案2】:

    这也可以在 PHP 中完成,无需修改 SQL 查询,只需向后迭代结果集即可:

    $res = mysql_query(...);
    for($i=mysql_num_rows($res)-1; $i>=0; $i--) {
        //do whatever
    }
    

    我承认我不知道性能差异是什么(如果有的话),但这只是可能适合您的另一种选择。

    【讨论】:

    • 我更喜欢这种方法,我认为它将选择三个最新的和先输出最旧的想法更好地分开(至少在我看来:p)
    • 嗯,最好在服务器上做尽可能多的工作(在数据库中),而不是让用户端来做(使用 php),但我非常感谢你的答案。
    • 我认为这真的归结为偏好问题。我通常喜欢在 SQL 中做尽可能多的事情,但有时它会混淆代码,而 PHP 更具可读性和可理解性,恕我直言,所以有时向后迭代只会让代码中实际发生的事情更加清晰.
    • 补充一下 cegfault 所说的,用 PHP 来做对于大多数网站来说是完全没问题的,但是当你有很高的用户流量时,你可以节省的每一点速度都会加起来。
    【解决方案3】:
    $result = mysqli_query($con,"SELECT * FROM (SELECT * FROM messeges WHERE username='{$_SESSION['username']}' ORDER BY id DESC LIMIT 3) t ORDER BY id ASC");
    

    【讨论】:

    • 纯代码答案对 SO 读者的教育作用很小。请编辑您的答案以包括一些解释。您的答案在审核队列中,因为它已被标记为低质量。 (...请格式化您的代码)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多