Код: Выделить всё
+----+------+
| id | name |
+----+------+
| 1 | aaaa |
| 2 | bbbb |
| 4 | dddd |
| 7 | gggg |
+----+------+
поэтому вы не можете получить действительный предыдущий или следующий идентификатор, просто добавляя или вычитая 1 к текущему идентификатору.
В SQL, чтобы получить действительный идентификатор вперед и назад, я бы написал следующее.
Код: Выделить всё
SELECT
(SELECT id FROM topics WHERE id < tmp.id ORDER BY id DESC LIMIT 1) AS prev_id,
(SELECT id FROM topics WHERE id > tmp.id ORDER BY id ASC LIMIT 1) AS next_id
FROM
topics AS tmp
WHERE
id = 1
;
Код: Выделить всё
+---------+---------+
| prev_id | next_id |
+---------+---------+
| NULL | 2 |
+---------+---------+
id = 2
+---------+---------+
| prev_id | next_id |
+---------+---------+
| 1 | 4 |
+---------+---------+
id = 4
+---------+---------+
| prev_id | next_id |
+---------+---------+
| 2 | 7 |
+---------+---------+
id = 7
+---------+---------+
| prev_id | next_id |
+---------+---------+
| 4 | NULL |
+---------+---------+
id = 999
empty set
Я подтвердил, что мой приведенный выше необработанный SQL работает должным образом, но как я могу написать его как построитель запросов CodeIgniter?
В частности, это должно быть что-то вроде этого:
Код: Выделить всё
public function getBothIds($id)
{
$tableName = "topics";
$columnName = "id";
$asColumnNamePrev = "prev_" . $columnName;
$asColumnNameNext = "next_" . $columnName;
$query = $this->db
->select_min($columnName, $asColumnNamePrev) // how to write where inside of select_min?
->select_max($columnName, $asColumnNameNext) // how to write where inside of select_max?
->where($columnName, $id)
->get($tableName)
->row();
return $query;
}
Подробнее здесь: https://stackoverflow.com/questions/629 ... h-gapped-i
Мобильная версия