Как использовать MySQL разделение с номером строки, чтобы вернуть элемент по типу - PullRequest
0 голосов
/ 07 ноября 2019

Пытаюсь выбрать запись из таблицы базы данных, используя mysql PARTITION и несколько INNER JOIN, чтобы вернуть 3 записи, в зависимости от типа продукта.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что пользователь, который выбирает запись, имеет более 5 типов продуктов в разделе «Бакалея, еда и напитки», но мой запрос вернет 3 напитка, 2 бакалеи и 1 еду, даже еслия изменяю предел раздела, он все еще не возвращается, как ожидалось.

Вот мой запрос

SELECT sl.business_name, sl.business_country, sl.seller_private_key,  p.product_name, p.product_id,  p.product_price,  p.product_type, p.product_added_date, p.product_seller_key
FROM (
    SELECT p.product_name, p.product_id,  p.product_price,  p.product_type, p.product_added_date, p.product_seller_key,
    ROW_NUMBER() OVER(PARTITION BY p.product_type ORDER BY p.product_type) AS limit_group
    FROM seller_stores_products p
    WHERE p.product_availability IN(1,2)
) p

INNER JOIN seller_account sl
ON p.product_seller_key = sl.seller_private_key

INNER JOIN seller_stores st
ON st.store_seller_key = sl.seller_private_key

WHERE limit_group <= 5

    AND sl.seller_private_key = "t9HfbiEDzIXyHjvx57uI"
    GROUP BY p.product_id

ORDER BY sl.seller_private_key ASC, p.product_added_date DESC
LIMIT 25

Также здесь есть скрипка

Ожидаемый результат - выбрать максимум 3 записи, только если их больше трехкаждый тип продукта.

1 Ответ

0 голосов
/ 07 ноября 2019

Полагаю, вам нужен запрос ниже -

SELECT business_name
      ,business_country
      ,seller_private_key
      ,product_name
      ,product_id
      ,product_price
      ,product_type
      ,product_added_date
      ,product_seller_key
FROM (SELECT sl.business_name
            ,sl.business_country
            ,sl.seller_private_key
            ,p.product_name
            ,p.product_id
            ,p.product_price
            ,p.product_type
            ,p.product_added_date
            ,p.product_seller_key
            ,ROW_NUMBER() OVER(PARTITION BY p.product_type ORDER BY p.product_type) AS limit_group
      FROM seller_stores_products p
      JOIN seller_account sl ON p.product_seller_key = sl.seller_private_key
      WHERE sl.seller_private_key = "t9HfbiEDzIXyHjvx57uI"
      AND p.product_availability IN(1,2)
      ORDER BY sl.seller_private_key ASC, p.product_added_date DESC
      LIMIT 25) X
WHERE limit_group <= 3

Здесь - демонстрационная версия.

...