Получение уникальных значений для разных столбцов в одном запросе

У меня есть фильтр-бокс, где люди могут фильтровать по марке, модели, топливу.

но прежде чем мы отфильтруем нашу страницу, сначала появятся три поля выбора

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

Я не хочу делать три запроса, возможно, я могу сделать это в одном запросе. Можно ли получить уникальные значения для всех трех данных (марки, модели, виды топлива)?

Что ж, вам придется сделать три запроса. Иметь уникальные значения для всех трех данных (марки, модели, виды топлива) будет недостаточно. Второй запрос должен быть параметризован результатом первого (модели, принадлежащие выбранной марке), а третий запрос - результатами первого и второго (виды топлива для выбранной марки и модели).

Stefanov.sm 13.06.2024 09:11
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Относительно

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;

Другие вопросы по теме