Попытка вернуть все значения вместо одного дублирующегося значения в PostgreSQL в учебнике Next.js, глава 7.

Вопрос или проблема

Используя код ниже:

  SELECT invoices.amount, customers.name, customers.image_url, customers.email, invoices.id
      FROM invoices
      JOIN customers ON invoices.customer_id = customers.id
      ORDER BY invoices.date DESC
      LIMIT 5

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

  {
    id: '76d65c26-f784-44a2-ac19-586678f7c2f2',
    name: 'Michael Novotny',
    email: '[email protected]',
    image_url: '/customers/michael-novotny.png',
  },

дублируется 5 раз в отличие от наиболее недавнего убывающего порядка объектов из моих тестовых данных:

 {
    id: 'd6e15727-9fe1-4961-8c5b-ea44a9bd81aa',
    name: 'Evil Rabbit',
    email: '[email protected]',
    image_url: '/customers/evil-rabbit.png',
  },
  {
    id: '3958dc9e-712f-4377-85e9-fec4b6a6442a',
    name: 'Delba de Oliveira',
    email: '[email protected]',
    image_url: '/customers/delba-de-oliveira.png',
  },
  {
    id: '3958dc9e-742f-4377-85e9-fec4b6a6442a',
    name: 'Lee Robinson',
    email: '[email protected]',
    image_url: '/customers/lee-robinson.png',
  },
  {
    id: '76d65c26-f784-44a2-ac19-586678f7c2f2',
    name: 'Michael Novotny',
    email: '[email protected]',
    image_url: '/customers/michael-novotny.png',
  },
  {
    id: 'CC27C14A-0ACF-4F4A-A6C9-D45682C144B9',
    name: 'Amy Burns',
    email: '[email protected]',
    image_url: '/customers/amy-burns.png',
  },

Может, кто-то укажет, где я ошибся, потому что после нескольких итераций и изучения документации я не вижу, почему я не получаю последний результат из 5 различных объектов вместо одного объекта, дублирующегося 5 раз.

Ниже приведен скриншот кода в запросе, и результаты до этого – это только дубликаты в отличие от тестовых данных, в которых больше значений. запрос к базе данных

Глава 7 https://nextjs.org/learn/dashboard-app/fetching-data

Я изучил документацию по SQL и проверил код, но не могу понять, почему у меня возникла проблема и надеюсь, что кто-то, кто также имел такую же, может предложить альтернативу, так как это часть учебника, который не рекомендуется использовать в производстве, так как это нестабильная версия.

Даже наполнение данных было темой обсуждения на различных форумах по поводу веб-разработчиков, пытающихся сделать все правильно и освоить этот последний способ программирования в NextJS.

Обновление: После дальнейшей отладки я использовал код ниже:

      SELECT invoices.amount, customers.name, customers.image_url, customers.email, invoices.id
      FROM  invoices
      JOIN customers ON invoices.customer_id = customers.id
      LIMIT 5

И я смог получить:

 {
    id: 'd6e15727-9fe1-4961-8c5b-ea44a9bd81aa',
    name: 'Evil Rabbit',
    email: '[email protected]',
    image_url: '/customers/evil-rabbit.png',
  },
  {
    id: '3958dc9e-712f-4377-85e9-fec4b6a6442a',
    name: 'Delba de Oliveira',
    email: '[email protected]',
    image_url: '/customers/delba-de-oliveira.png',
  },
  {
    id: '3958dc9e-742f-4377-85e9-fec4b6a6442a',
    name: 'Lee Robinson',
    email: '[email protected]',
    image_url: '/customers/lee-robinson.png',
  },
  {
    id: '76d65c26-f784-44a2-ac19-586678f7c2f2',
    name: 'Michael Novotny',
    email: '[email protected]',
    image_url: '/customers/michael-novotny.png',
  },
  {
    id: 'CC27C14A-0ACF-4F4A-A6C9-D45682C144B9',
    name: 'Amy Burns',
    email: '[email protected]',
    image_url: '/customers/amy-burns.png',
  },

Однако они не находятся в порядке убывания по дате счета:

  ORDER BY invoices.date DESC

Если вы прокрутите вверх, вы увидите, что строка кода “ORDER BY” приводит к тому, что один объект появляется 5 раз при выполнении на панели управления postgresql.

Сейчас я пытаюсь понять, как получить убывающий порядок 5 уникальных объектов, которые я получаю с кодом, который не включает строку “ORDER BY”… любые внешние мнения и идеи я бы оценил в помощи мне разобраться с этим, пожалуйста? Я все еще отлаживаю и изучаю документацию с моей стороны.

Ответ или решение

Вопрос о получении уникальных значений, а не дублированных записей из базы данных PostgreSQL может возникнуть у разработчиков, работающих с Next.js, особенно в контексте использования SQL-запросов. Рассмотрим вашу проблему более подробно и предложим решение.

Контекст и Проблема

Вы используете следующий SQL-запрос:

SELECT invoices.amount, customers.name, customers.image_url, customers.email, invoices.id
FROM invoices
JOIN customers ON invoices.customer_id = customers.id
ORDER BY invoices.date DESC
LIMIT 5

При выполнении этого запроса вы получаете одну и ту же запись (преподавателя) дублированной пять раз, что не соответствует вашим ожиданиям. Также вы упомянули, что при исключении части ORDER BY вы успешно получили пять уникальных записей, но в порядке, который не соответствует вашим ожиданиям по дате.

Решение Проблемы с Дублированием

Причина дублирования записей заключается в том, как работает ORDER BY. Если у вас несколько записей из таблицы invoices, относящихся к одному и тому же пользователю (в данном случае Michael Novotny), и у всех этих записей одинаковая дата, PostgreSQL может возвращать их в качестве дублирующих.

Для устранения этой проблемы, вам может понадобиться использовать конструкцию DISTINCT ON или использовать подзапрос для выбора уникальных записей. Вот пример, который может помочь:

SELECT DISTINCT ON (customers.id)
    invoices.amount, 
    customers.name, 
    customers.image_url, 
    customers.email, 
    invoices.id
FROM invoices
JOIN customers ON invoices.customer_id = customers.id
ORDER BY customers.id, invoices.date DESC
LIMIT 5

Здесь DISTINCT ON (customers.id) гарантирует, что для каждого уникального пользователя будет возвращена только одна запись. По умолчанию будет возвращена первая запись для каждого уникального пользователя в порядке, установленном ORDER BY. В этом случае мы сначала упорядочиваем по customers.id и затем по invoices.date (по убыванию).

Сортировка по Дате

Однако в результате этого запроса вы получите уникальные записи клиентов, но первая из них может не всегда быть с самой последней датой. Чтобы обеспечить получение последних по дате записей, можно использовать подзапрос:

SELECT invoices.amount, 
       customers.name, 
       customers.image_url, 
       customers.email, 
       invoices.id
FROM invoices
JOIN customers ON invoices.customer_id = customers.id
WHERE invoices.date IN (
    SELECT MAX(date) 
    FROM invoices 
    GROUP BY customer_id
)
ORDER BY invoices.date DESC
LIMIT 5;

Этот запрос извлекает только последние (по дате) записи для каждого клиента, прежде чем соединять их с таблицей customers. Это позволит вам получить актуальные данные по всем пользователям в нужном порядке.

Заключение

Таким образом, для получения уникальных записей с правильной сортировкой по дате в PostgreSQL, рекомендуется использовать конструкцию DISTINCT ON или подзапросы. Оба подхода позволяют избежать дублирования и обеспечивают корректный вывод данных для вашего приложения на Next.js. Если у вас остались вопросы или необходима дополнительная помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...