Вопрос или проблема
Используя код ниже:
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. Если у вас остались вопросы или необходима дополнительная помощь, не стесняйтесь обращаться!