@PRodion

Как построить запрос с 3 уровнями сортировки?

Если id нет в get-параметре (строка) или в сессии (массив), то выводим по популярности все цвета, которые есть в наличии. Если в get-параметре есть id, то этот цвет должен быть первым. Если в get-параметре есть id и в сессии есть масса id, то первый должен быть цвет по get-параметру, потом цвета из массива сессии и только потом все остальные цвета. При этом, все цвета должны сортироваться по популярности и быть в наличии.

Сейчас у меня проверяется только наличие get-параметра.

public function index(Request $request)
{
    $colors_ids = $request->session()->get('colors_ids');

    $this->validate($request, [
        'color' => 'numeric',
    ]);

    $colors = Color::where([['in_stock', '=', '1']])
                   ->orderByRaw(sprintf("CASE id WHEN %d THEN 1 ELSE 2 END", $request->get('color')))
                   ->orderBy("popularity", "desc")
                   ->get();

    return view('color.index', compact('colors'));
}
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 3
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Вот вариант SQL запроса:
select *
from colors
order by 
	id = 3 desc, -- 3 in get
	id in (5, 6) desc, -- 5 and 6 in session 
	popularity asc;


MariaDB fiddle
Ответ написан
Кажется вам нужен UNION
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
ORDER BY `color` != IFNULL(:color, 0),
         FIND_IN_SET(`color`, :colors) != 0,
         `popularity`
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы