SQL выбирает N строк из 5 разных идентификаторов

У меня есть небольшой вопрос.

Я хотел бы выбрать N строк из 5 id.

Я уже пробовал этот запрос:

SELECT a.fk_produit_id, a.id, a.titre, a.prix, a.description, a.short_description, a.image_url 
from produits p, articles a 
WHERE p.id = a.fk_produit_id AND p.fk_category_id IN (2, 248, 335, 493, 1038) 
GROUP BY p.fk_category_id;

Или этот:

SELECT a.fk_produit_id, a.id, a.titre, a.prix 
from articles a 
inner join produits p 
WHERE p.id = a.fk_produit_id AND p.fk_category_id IN (2, 248, 335, 493, 1038) 
order by a.fk_produit_id limit 5

Я хотел бы, чтобы результат был таким:

id: 1 : -> record 1
          -> record 1
          -> record 1
          -> record 1
          -> record 1
id: 2 : -> record 2
          -> record 2
          -> record 2
          -> record 2
          -> record 2
id: 3 : -> record 3
          -> record 3
          -> record 3
          -> record 3
          -> record 3

id: 4 : -> record 4
          -> record 4
          -> record 4
          -> record 4
          -> record 4
id: 5 : -> record 5
          -> record 5
          -> record 5
          -> record 5
          -> record 5

Но они не работали, как я хочу. Если кто-то может мне помочь или объяснить, как я могу это решить. Заранее спасибо, ребята, я продолжаю свои исследования рядом со мной.

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

Slava Rozhnev 24.11.2022 13:51

Вы хотите 5 статей на продукт или 5 продуктов на статью?

jarlh 24.11.2022 14:41

Я хотел бы 5 статей по категориям продуктов.

Nicolas 24.11.2022 14:49
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Этого можно добиться, используя ROW_NUMBER()

SELECT  a.fk_produit_id, 
        a.id, 
        a.titre, 
        a.prix, 
        a.description, 
        a.short_description, 
        a.image_url
FROM    (   SELECT  a.fk_produit_id, 
                    a.id, 
                    a.titre, 
                    a.prix, 
                    a.description, 
                    a.short_description, 
                    a.image_url,
                    ROW_NUMBER() OVER(PARTITION BY p.fk_category_id 
                                      ORDER BY a.fk_produit_id) AS RowNumber
            FROM    produits AS p
                    INNER JOIN articles AS a
                        ON p.id = a.fk_produit_id
            WHERE   p.fk_category_id IN (2, 248, 335, 493, 1038)
                
        ) AS a
WHERE   a.RowNumber <= 5; -- Change 5 to whatever "n" is

Возможно, вам придется изменить свой заказ по мере необходимости, но это должно помочь вам начать

Это не совсем так, как я хочу. Обычно я хотел бы отображать 25 записей (5 записей x 5 id). Но этот запрос выбирает 9000+ записей.

Nicolas 24.11.2022 14:04

Без каких-либо надлежащих демонстрационных данных трудно понять, почему это не работает должным образом. Я собрал упрощенный пример, который возвращает только 25 строк, возможно, вы пропустили финальное предложение where? или у вас есть другие условия (например, операционная), где это может повлиять на результаты?

GarethD 24.11.2022 14:54

Я редактирую и добавляю несколько примеров таблицы. Скажи мне, если тебе нужно что-то еще. Спасибо вам за вашу помощь!

Nicolas 24.11.2022 15:06

Можете ли вы опубликовать некоторые образцы данных, которые имеют отношение к вашей проблеме, пожалуйста? С вашими примерными данными первоначальный запрос, который вы разместили (исключая лимит и группировку), возвращает только 5 результатов, поэтому трудно использовать эти данные для визуализации проблемы, с которой вы столкнулись. dbfiddle.uk/JcC5JNgm

GarethD 24.11.2022 15:31

Я добавляю некоторые изображения моей базы данных. Первая — это таблица «статьи», а вторая — таблица «продукты». Скажи мне, если тебе нужно что-то еще

Nicolas 24.11.2022 15:39
Изображения кода/данных не так уж и полезны. Можете ли вы создать скрипку (немного похожую на те, на которые я ссылался), которая содержит данные, демонстрирующие реальную проблему, с которой вы столкнулись? Это не обязательно должны быть фактические данные или ваша полная база данных, достаточно данных, чтобы продемонстрировать проблему. Основываясь на том, что вы опубликовали, нет причин, по которым запрос, который я опубликовал, или тот, который опубликовал Ярл, не будет работать, поэтому должно быть что-то, что вы не сообщаете нам о своем запросе или ваших данных.
GarethD 24.11.2022 15:47

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

GarethD 24.11.2022 15:48

Хорошо, я использовал ваш код и изменил его, и я нашел решение своей проблемы. Спасибо большое, наконец-то я могу двигаться дальше. :)

Nicolas 24.11.2022 16:23

Вы можете использовать боковую производную таблицу, чтобы вернуть 5 статей для каждого продукта:

SELECT p.*, a.fk_produit_id, a.id, a.titre, a.prix 
from produits p
cross join
    lateral (select * from articles
             WHERE p.id = fk_produit_id
             order by fk_produit_id
             limit 5) a
where p.fk_category_id IN (2, 248, 335, 493, 1038) 

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