Codeigniter - Как выбрать идентификаторы строки соответствующего столбца даты в запросе - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь написать запрос, который выводит shiftId в массив.У меня есть таблица, которая выглядит следующим образом.

+---------+----------+-------+
| shiftId | endTime  | shift |
+---------+----------+-------+
|       1 | 03/03/19 |     1 |
|       2 | 03/03/19 |     2 |
|       3 | 03/01/19 |     1 |
|       4 | 03/01/19 |     2 |
+---------+----------+-------+

Я хочу вернуть shiftId каждой даты с наибольшим сдвигом и не знаю, как это сделать.

Я хочу свой массиввыглядеть как показано ниже, основываясь на приведенной выше таблице.

Array
(
    [0] => 2
    [1] => 4
)

Я пытался указать дату group_by, а затем select_max для каждой смены, но не думаю, что я на правильном пути.Любая помощь будет принята.

Я хочу выбрать shiftId foreach date, где shift # является наибольшим.

1 Ответ

0 голосов
/ 04 марта 2019

Вы были на правильном пути!

Либо используйте (это показывает 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();
...