У меня есть набор идентификаторов, переданных в определенном порядке, которые необходимо сохранить. Я запрашиваю из нескольких левых соединений данные, связанные с каждым ID. Идентификаторы возвращаются из поиска, поэтому порядок должен быть сохранен, чтобы сделать результаты действительными (в противном случае поиск делает бесполезным).
Мой код выглядит примерно так:
$this->db->where_in('id', $array_of_ordered_ids);
Например –
$this->db->where_in('id', array(4,5,2,6));
Вернет результаты в порядок 2,4,5,6.
Я бы хотел, чтобы он сохранил заказ и вернул результаты 4,5,2,6.
Спасибо,
Чтобы заказать результат по порядку в вашем массиве, вы можете сделать следующее:
$array_of_ordered_ids = array(4,5,2,6);
Поскольку вы уже знаете порядок номеров, вы можете использовать функцию Docs Mysql FIELD()
:
ORDER BY FIELD(id, 4, 5, 2, 6);
Чтобы создать такую строку, вы можете использовать implode
Docs :
$order = sprintf('FIELD(id, %s)', implode(', ', $array_of_ordered_ids));
Попробуйте:
$array_of_ordered_ids = array(4,5,2,6); $this->db->where_in('id', $array_of_ordered_ids); $order = sprintf('FIELD(id, %s)', implode(', ', $array_of_ordered_ids)); $this->db->order_by($order);
Как и все ответы, которые я нашел на SO, где только полуправа, но все дали хорошие подсказки, я успешно реализовал код для извлечения набора строк, упорядоченного по порядку в заданном массиве.
Чтобы создать sql следующим образом:
SELECT * FROM (`product`) WHERE `id` IN (2, 34, 234) ORDER BY FIELD(`id`, 2, 34, 234)
используйте этот код, а $ ids содержит массив (2, 34, 234).
// select from ... $this->db->where_in('id',$ids); $this->db->_protect_identifiers = FALSE; // stop CI adding backticks $order = sprintf('FIELD(id, %s)', implode(', ', $ids)); $this->db->order_by($order); $this->db->_protect_identifiers = TRUE; // switch on again for security reasons // get...
см. также здесь: http://ellislab.com/forums/viewthread/137157/#1058666
Спасибо за самое большое решение.
$orde_num_string = implode(",",$order_num); $this->db->where_in("cir_order.order_num",$order_num); $this->db->_protect_identifiers = FALSE; $this ->db->order_by("FIELD(cir_order.order_num, $orde_num_string)"); $this->db->_protect_identifiers = TRUE;