获取 Zend 1 中先前存在的 MySQL 行

Get previous existing MySQL row in Zend 1

我的问题与获取数据库中的下一个现有 ID 有关。 虽然找到下一个元素效果很好:

$this->view->next = $images->fetchRow($images->select()->where('id > ?', $imageId));

我找不到上一个元素:

$this->view->prev = $images->fetchRow($images->select()->where('max(id) < ?', $imageId));

我总是得到:

SQLSTATE[HY000]: General error: 1111 Invalid use of group function

你能帮我解决这个问题吗? 感谢您的帮助。

恐怕您误用了 max 子句,因为它不能在 where 子句中,而是在 select.

最简单的方法是使用 subselects,即:

$select = $images->select(true)
                 ->reset(Zend_Db_Select::COLUMNS)
                 ->columns(array(
                     'MAX(id)'
                 ))->where('id < ?', $imageid);

$this->view->prev = $images->fetchRow(
                                $images->select()
                                ->where('id = ?', $select);

这将生成如下子句:

SELECT `tablename`.* FROM `tablename` WHERE (id = (SELECT MAX(id) FROM `tablename` WHERE (id < 17)));

但我认为最好的方法不是使用subselect 也不是MAX 子句,而是顺序和限制。您将按 id 降序排列查询的所有行结果,然后 select 仅第一个:

$this->view->prev = $images->fetchRow(
                                $images->select()
                                ->where('id < ?', $imageid)
                                ->order('id DESC')
                                ->limit(1);

这将生成:

SELECT 
    `tablename`.* 
FROM 
    `tablename`
WHERE
    (id < 17)
ORDER BY id DESC
LIMIT 1

这会给你相同的行。

希望对您有所帮助! :)

您正在尝试在 WHERE 子句 中编写 AGGREGATE 函数(MAX) MySQL 数据库中不允许。您需要将您的条件放入 HAVING() 子句 以解决您得到的错误(组函数的无效使用)。

尝试做类似的事情:

$this->view->prev = $images -> fetchRow($images -> select()
                                                -> group('id')
                                                -> having('MAX(id) < ?', $id)
                                                -> order("id DESC") );