【问题标题】:Getting the next and the previous record in mysql [duplicate]在mysql中获取下一条和上一条记录[重复]
【发布时间】:2013-07-07 07:36:18
【问题描述】:

我正在查询一个 mysql 数据库表,首先创建一个临时表并用 select 语句中的数据填充它。

为了测试它,我使用一个已知的数据库 id 并测试它是否正确获取下一个和上一个记录。

这是我的功能

function get_next($id){
    $db = new PDO('mysql:host=localhost;dbname=world', 'root', '');
    $db->query("CREATE TEMPORARY TABLE nr AS SELECT ID,Name,Population FROM city WHERE id > $id ORDER BY ID LIMIT 1;");
    $orm = $db->query("SELECT * FROM nr WHERE ID > $id ORDER BY ID LIMIT 1;");
    $id = $orm->fetchColumn(0);
    if ($id !== false) {
        return $id;
    }
}
function get_previous($id){
    $db = new PDO('mysql:host=localhost;dbname=world', 'root', '');
    $db->query("CREATE TEMPORARY TABLE pr AS SELECT ID,Name,Population FROM city WHERE ID > $id ORDER BY ID LIMIT 1;");
    $orm = $db->query("SELECT * FROM pr WHERE ID < $id ORDER BY ID DESC LIMIT 1;");
    $id = $orm->fetchColumn(0);
    if ($id !== false) {
        return $id;
    }
}

我可以正确获取next 记录,但我得到previous 记录错误,因为它说以前的记录是当前记录。

我之前的查询是不是错了?

【问题讨论】:

  • 对剩下的问题不做评论,但你应该使用绑定参数。
  • get_previous - 其中 id current_id。检查记录是否存在

标签: php mysql


【解决方案1】:

您的临时查询正在查找大于您的 ID 的 ID,因此下一个查询将找不到小于该 ID 的任何内容。

【讨论】:

    【解决方案2】:

    您需要从您的get_previous 函数中删除DESC。用我的替换这一行:

    $orm = $db->query("SELECT * FROM pr WHERE ID < $id ORDER BY ID LIMIT 1;");
    

    【讨论】:

    • 这工作$db-&gt;query("CREATE TEMPORARY TABLE pr AS SELECT * FROM city"); $orm = $db-&gt;query("SELECT * FROM pr WHERE ID &lt; $id ORDER BY ID DESC LIMIT 1;");
    • 是的,create table query 中的内容相同,即:WHERE ID &lt; $id
    【解决方案3】:

    我不会使用临时表,因为您只对 id 感兴趣,所以不需要检索其他信息

    # To retrieve the previous id:
    SELECT MAX(id) FROM city WHERE id < $id
    # alternative:
    SELECT id FROM city WHERE id < $id ORDER BY id DESC LIMIT 1
    
    # To retrieve the next id:
    SELECT MIN(id) FROM city WHERE id > $id
    # alternative:
    SELECT id FROM city WHERE id > $id ORDER BY id ASC LIMIT 1
    

    【讨论】:

    • 在普通表上获取下一条/上一条记录很容易。当我想从复杂的选择语句中获取数据集中的下一条和上一条记录时,问题就出现了。
    • 在这种情况下,您只需要更复杂的查询。我不明白为什么你应该为此使用临时表,更是如此,因为当你填充临时表时你已经有了答案。
    • 你是对的。我取消了临时表,它仍然有效。也许你确认了这一点。当我进行选择时,选择数据将保存在类似于表的容器中,因此不需要将数据放在临时表中?。
    【解决方案4】:

    上一行

    SELECT * FROM table WHERE id < 1 ORDER BY id DESC LIMIT 1;
    

    下一行

    SELECT * FROM table WHERE id > 1 ORDER BY id ASC LIMIT 1;
    

    我希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多