У меня есть фильтр-бокс, где люди могут фильтровать по марке, модели, топливу.
но прежде чем мы отфильтруем нашу страницу, сначала появятся три поля выбора
Select brand, Select model, select fuel
мой начальник хочет показывать только те значения, которые существуют в нашей базе данных.
например, когда существуют BMW и Audi, тогда в марке Select отображаются только эти две марки. Не другие бренды.
то же самое для модели и топлива.
Вот у меня есть решение, как сделать это для бренда
select
brand
FROM cars
GROUP BY brand
но когда я хочу добавить его для модели и топлива, я получаю повторяющиеся значения, возможно, в брендах
select
array_agg(brand) as brands,
array_agg(model) as models,
array_agg(fuel) as fuels
FROM cars
GROUP BY model, brand, fuel
Я не хочу делать три запроса, возможно, я могу сделать это в одном запросе. Можно ли получить уникальные значения для всех трех данных (марки, модели, виды топлива)?
Относительно
SELECT brand FROM cars GROUP BY brand
Столбцы GROUP BY
редко используются, а затем не используются какие-либо функции агрегирования, такие как MIN
, SUM
, COUNT
и т. д. Мы бы предпочли написать
SELECT DISTINCT brand FROM cars;
что делает намерение более ясным. Альтернативой может быть выбор одной строки с массивом брендов:
SELECT ARRAY_AGG(DISTINCT brand) FROM cars;
Если вам нужны разные бренды, модели и виды топлива из таблицы, проще всего написать три отдельных запроса:
SELECT DISTINCT brand FROM cars;
SELECT DISTINCT model FROM cars;
SELECT DISTINCT fuel FROM cars;
или один запрос, который снова приводит к одной строке с массивом для каждой сущности:
SELECT
ARRAY_AGG(DISTINCT brand) AS brands,
ARRAY_AGG(DISTINCT model) AS models,
ARRAY_AGG(DISTINCT fuel) AS fuels
FROM cars;
Что ж, вам придется сделать три запроса. Иметь уникальные значения для всех трех данных (марки, модели, виды топлива) будет недостаточно. Второй запрос должен быть параметризован результатом первого (модели, принадлежащие выбранной марке), а третий запрос - результатами первого и второго (виды топлива для выбранной марки и модели).