Как сгруппировать по 2 столбцам мобильных номеров в 1, если они совпадают со средней и суммарной логами c в операторе выбора в PHP Laravel MySQL - PullRequest
0 голосов
/ 21 апреля 2020

Я пытался сделать это с прошлой недели, но все еще не повезло.

Вот мои примерные данные:

mobile_no_1 | mobile_no_2 | distance | interaction_started_at | interaction_ended_at | min_distance | max_distance
----------- | ----------- | -------- | ---------------------- | -------------------- | ------------ | ------------ 
0111        | 0222        | 10.2     | 2020-04-11 09:00:10    | 2020-04-11 09:00:20  | 10.2         | 10.2
0111        | 0222        | 10.2     | 2020-04-11 09:00:30    | 2020-04-11 09:00:40  | 10.2         | 10.2
0111        | 0222        | 10.2     | 2020-04-11 09:00:50    | 2020-04-11 09:01:00  | 10.2         | 10.2
0111        | 0222        | 10.2     | 2020-04-11 09:01:10    | 2020-04-11 09:01:20  | 10.2         | 10.2

То, что я хочу, это получить среднее расстояние, мин минимального расстояния, максимального максимального расстояния и суммируйте продолжительность взаимодействия по разнице между началом и концом взаимодействия, затем сгруппируйте их по мобильным номерам 1 и 2, но я хочу сделать так, как если бы уже существовала пара мобильных номеров 1 и 2 Неважно, какой номер мобильного телефона 1, а какой номер мобильного телефона 2, его следует объединить

Я попытался с помощью eloquent это:

$interaction_list = Interaction::select(
    'id',
    'mobile_no_1',
    'mobile_no_2',
    DB::raw('ROUND(AVG(distance), 2) as distance'),
    'interaction_started_at',
    DB::raw('MIN(ROUND(min_distance, 2)) as min_distance'),
    DB::raw('MAX(ROUND(min_distance, 2)) as max_distance'),
    DB::raw('SUM(TIMESTAMPDIFF(SECOND, interaction_started_at, interaction_ended_at)) as duration')
    )->groupBy('mobile_no_1', 'mobile_no_2')
    ->orderBy($sort, $order)
    ->offset($start)
    ->limit($length)
    ->get();

И это результат, который я получаю:

mobile_no_1 | mobile_no_2 | distance | interaction_started_at | min_distance | max_distance | duration
----------- | ----------- | -------- | ---------------------- | ------------ | ------------ | --------
0111        | 0222        | 10.2     | 2020-04-11 09:00:10    | 10.2         | 10.2         | 30
0222        | 0111        | 10.2     | 2020-04-11 09:01:10    | 10.2         | 10.2         | 10

Для avg, min, max и sum уже правильно, но я хочу, чтобы приведенный выше результат был 1 строкой только для этой выборки данных с длительностью, равной 10 + 30 = 40, поскольку он объединен в 1 строку.

Я смог получить результат, используя distinct() до select() вместо groupBy(), но затем после получения других данных в таблице он становится неточным, поскольку в нем есть теракция мобильного номера 01234567892 с 0111111111, и запрос объединяет эту запись вместе как 01234567892 с 01234567893, следовательно, результат записи 01234567892 с 01111111 никогда не появляется в таблице, поэтому я считаю, что это уже неправильный подход.

...