Moodle从数据库读取数据:如何选择符合WHERE子句的第一条记录? TOP不起作用

时间:2015-05-23 08:21:09

标签: mysql sql moodle

我想通过{/ 1}} id存储在$myUserId中的特定用户检索最新博文的博客帖子标题。所以from this doc,我学会了这样做:

$latestPostSubject = $DB->get_record_sql('SELECT subject FROM {post} WHERE userid = ?', array($meUserId));

问题是,这会返回用户的所有博客帖子,而我只需要最新的

我做了什么:

  1. 所以当我尝试像

    这样的东西时
    $latestPostSubject = $DB->get_record_sql('SELECT TOP(1) subject FROM {post} WHERE userid = ?', array($meUserId));
    

    Reference.

    我收到语法错误。

  2.   

    从数据库中读取错误。

         

    调试信息:SQL语法中有错误;检查手册   对应于您的MySQL服务器版本,以获得正确的语法   在第1行'FROM mdl_post WHERE userid ='2''附近使用SELECT TOP(1)*   FROM mdl_post WHERE userid =? [array(0 =>'2',)]

         

    错误代码:dmlreadexception

    1. post table还包含createdlastmodified 字段,但是当我使用*打印用户的整个记录​​时 从post表中,我无法理解日期的格式

      • 这是一个10位数字:s 否则我会在创建博客文章的日期做一些数学计算。

        ... [lastmodified] => 1432051856 [created] => 1432051855 ...

    2. 问题:

      那么我该如何从表格中获取最新的博客文章?

      其次,为什么SQL语句中的TOP(1)不起作用?

1 个答案:

答案 0 :(得分:1)

$sql = "SELECT p.id, p.subject
        FROM {post} p
        WHERE p.userid = :userid
        ORDER BY p.id DESC";
$params = array('userid' => $my_user_id);
$latest_post_subject = $DB->get_record_sql($sql, $params, IGNORE_MULTIPLE);

将此页面固定为参考 - https://docs.moodle.org/dev/Data_manipulation_API

Moodle可以使用几个不同的数据库,因此SQL应该是通用的

实际上,如果您只想要标题,可以使用get_field

$sql = "SELECT p.subject
        FROM {post} p
        WHERE p.userid = :userid
        ORDER BY p.id DESC";
$params = array('userid' => $my_user_id);
$latest_post_subject = $DB->get_field_sql($sql, $params, IGNORE_MULTIPLE);

要显示日期,请使用user_date($ time)功能。时间以GMT和unix时间存储。 user_date()函数将以当前用户时区和日期/时间格式显示日期。