За последние 24 часа нас посетили 93027 программистов и 6254 робота. Сейчас ищут 1260 программистов ...

Запрос SQL без дубликатов по одному столбцу Laravel

Тема в разделе "PHP и базы данных", создана пользователем Ex1tar, 19 апр 2023.

Метки:
  1. Ex1tar

    Ex1tar Новичок

    С нами с:
    17 апр 2023
    Сообщения:
    1
    Симпатии:
    0
    Как я могу выбирать из базы данных все значения по одному столбцу, а по другому чтобы не повторялось прикрепляю скрин как ожидаю чтобы это выглядело[​IMG]

    29.04.2023
    01:00
    02:00
    03:00
    30.04.2023
    01:00
    02:00
    03:00


    DB [date, time]
    29.04.2023, 01:00
    29.04.2023, 02:00
    29.04.2023, 03:00
    30.04.2023, 01:00
    30.04.2023, 02:00
    30.04.2023, 03:00

    моя функция

    public function dateDay(){
    $date = DB::table('dates')->select('date', 'time')
    ->groupBy('date')
    ->get();
    return view('/archive', ['date' => $date]);
    }
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Используй ббкоды php или code чтобы оформить свой код. Он будет выглядеть более читабельным. Скрины никто не смотрит, а вложения не скачивают. Поэтому старайся обходиться без них. А вот что реально помогает, так это заготовка с данными на https://www.db-fiddle.com/
    И ещё, правильные имена очень важны для понимания. ты сам запутаешся через месяц глядя на свой код, если имена выбрал неправильно. почему $date = ??? Это же коллекция данных, а имя в единственном числе. Сделай $dates = .

    Даже если у тебя получится выполнить такой запрос без вываливания по ошибке, это логически не верный запрос. Потому что непонятно какую из 2х или более записей с повторяющимся группировочным значением надо вернуть! В таких случаях, надо или переосмыслить задачу, или использовать агрегатные функции. Например:
    - вернуть таки все записи без группировки;
    - сгруппировать и вернуть наименьшее из доступных значений (т.е. что случилось раньше в этот день).

    Группируем, берем только первое значение времени за каждый день
    PHP:
    1. $dates = DB::table('dates')->
    2.   ->select(['date', DB::raw('MIN(time) AS time')])
    3.   ->groupBy('date')
    4.   ->get();
    Берем все записи без группировки, но выводим дату как "заголовок" для группы значений.
    PHP:
    1. $dates = DB::table('dates')->
    2.   ->select(['date', 'time'])
    3.   ->orderBy('date') // это важно!
    4.   ->orderBy('time')
    5.   ->get();
    6.  
    7. // а в шаблоне blade
    8.  
    9. <div>
    10. @php
    11.   $prevDate = null;
    12. @endphp
    13.  
    14. @foreach($dates as $d)
    15.   @if($prevDate != $d->date)
    16.     <p><b>{{ $d->date }}</b></p>
    17. </div>
    18. <div>
    19.     @php
    20.       $prevDate = $d->date;
    21.     @endphp
    22.   @endif
    23.  
    24.   <p>
    25.     {{ $d->time }}
    26.   </p>
    27. @endforeach
    28. </div>