MySQL SELECT-запрос: Как я могу получить правильный идентификатор при использовании функции MIN () в моем запросе? - PullRequest
0 голосов
/ 22 июня 2019

Я программирую приложение C # для Windows Forms в Visual Studio и пытаюсь получить данные о минимальных ценах продуктов в супермаркетах 2 и 3 в списках покупок.

Первый шаг, который мне нужно сделатьэто сделать правильный SELECT-запрос, который возвращает эти данные из моей локальной базы данных MySQL.

В моей таблице цен есть следующие столбцы:

  • цена
  • штрих-код
  • supermarket_id

У меня также есть таблица супермаркетов, в которую входят 3 супермаркета:

  • supermarket_id = 1 ИМЯ = супермаркет1
  • supermarket_id = 2 ИМЯ = супермаркет2
  • supermarket_id = 3 ИМЯ = супермаркет3

Продукт имеет цену для каждого супермаркета в таблице супермаркетов

I 'используя следующий запрос, чтобы позволить базе данных вернуть нужные мне данные:

SELECT pro.name, MIN(p.price) AS 'Lowest Price', p.supermarket_id
FROM (
    SELECT i.product_barcode
    FROM shopping_list_items i
    WHERE i.shopping_list_id = 95
) s
JOIN prices p ON s.product_barcode = p.barcode
JOIN products pro ON s.product_barcode = pro.barcode
GROUP BY s.product_barcode;

Приведенный выше запрос возвращает название продукта, самую низкую цену продукта и supermarket_id.Но supermarket_id всегда равен 1, хотя цена продукта не в супермаркете1, а в супермаркете3.

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

Ответы [ 3 ]

0 голосов
/ 22 июня 2019

Для этого вы должны использовать subquery, чтобы получить все штрих-коды и их минимальные цены с помощью предложения group by and having. И затем вы можете использовать результат для дальнейшего объединения с таблицей prices.

select p2.price as lowest_price, p2.barcode as prod_barcode , p2.supermarket_id as supermarket from
            (
              select min(price) as min_p, barcode min_b from prices p1 where p1.supermarket_id!=1 group by barcode having barcode in 
              (
                SELECT i.product_barcode FROM shopping_list_items i WHERE i.shopping_list_id = 95
              )
            ) 
    m join prices p2 where m.min_p=p2.price and m.min_b= p2.barcode;
0 голосов
/ 22 июня 2019

Рассмотрим этот скорректированный агрегатный запрос с правильным предложением GROUP BY, которое разрешает потребность ОП:

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

SELECT p.supermarket_id, 
       pro.name as product_name, 
       MIN(p.price) AS 'Lowest Price'
FROM (
    SELECT i.product_barcode
    FROM shopping_list_items i
    WHERE i.shopping_list_id = 95
) s
JOIN prices p ON s.product_barcode = p.barcode
JOIN products pro ON s.product_barcode = pro.barcode
GROUP BY p.supermarket_id, 
         pro.name;
0 голосов
/ 22 июня 2019
SELECT p.name, pr.lowest_price, p.supermarket_id,s.supermarket_name from 
products p INNER JOIN
(SELECT barcode,supermarket_id,MIN(price) as AS 'lowest_price'
FROM prices
GROUP BY barcode,supermarket
)pr on pr.barcode = p.barcode
INNER JOIN supermarkets s on pr.supermarket_id = s.supermarket_id
...