Вы были на правильном пути!
Либо используйте (это показывает SQL более четко):
$query = $this->db->query('SELECT max(shiftId) shiftId FROM yourtable GROUP BY endTime')->result_array();
Или (если вы хотите использовать CI'sпостроитель запросов):
$query = $this->db->select_max('shiftId')->group_by('endTime')->get('yourtable')->result_array();
Обе группы группируют таблицу по endTime
, а затем возвращают максимум shiftId
для каждой группы идентичных endTime
с.Оба дают массив, который выглядит следующим образом:
Array
(
[0] => Array
(
[shiftId] => 2
)
[1] => Array
(
[shiftId] => 4
)
)
Чтобы избавиться от индекса shiftId
в результате и получить точную структуру массива из вашего OP, используйте:
array_column($query, 'shiftId');
Редактировать
Если вы хотите получить shiftId
для каждой комбинации endTime
+ MAX(shift)
, используйте это:
SELECT shiftId FROM yourtable
WHERE CONCAT(endTime, "-", shift) IN (
SELECT CONCAT(endTime, "-", MAX(shift)) FROM yourtable GROUP BY endTime
)
Внутренний запрос (после IN
) делает более или менее то же самое, что и предыдущий запрос: он группирует записи в таблице по endTime
, а затем получает максимум shift
для каждой группы идентичных endTime
с.и здесь он объединяет это с endTime
и тире.
Вам необходимо объединить endTime
с MAX(shift)
здесь, потому что один MAX(shift)
не уникален в таблице (есть более одногосдвиг с номером 2, например), и ни один из них не является endTime
.
Внешний запрос (SELECT shiftId
...) затем находит совпадающее shiftId
для каждой комбинации endTime
+ MAX(shift)
и возвращает это.
Для этого вам нужно использовать два (вложенных) запроса, потому что внутренний использует группировку, а внешний - нет.и вам не разрешено смешивать эти два типа в одном запросе.
Примечание: CONCAT
работает только в MySQL, если вы используете другой тип базы данных, вам, возможно, придется поискатькакой синтаксис объединения он использует (например, может быть +
или ||
).
в CI:
$query = $this->db->query('SELECT shiftId FROM yourtable
WHERE CONCAT(endTime, "-", shift) IN (SELECT CONCAT(endTime, "-", MAX(shift)) FROM yourtable GROUP BY endTime)')->result_array();