Выбор дополнительных полей на основе SQL MIN () - PullRequest
1 голос
/ 14 апреля 2011

При использовании функции SQL MIN () я хочу выбрать любые дополнительные поля, соответствующие строке MIN. Следующий запрос возвращает правильный MIN (sellPrice), но не соответствует правильной строке в таблице product_price. Как мне этого добиться?

SELECT p.*, MIN(pp.sellPrice) AS sellPrice, pp.* FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON p.`id` = ppg.`productId`
LEFT JOIN `product_price` AS pp ON ppg.`id` = pp.`priceGroupId`
WHERE p.`active` = 1 AND p.id = 1

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Хотите ли вы минимальную цену продажи для всех продуктов или для каждого продукта ?

для всех продуктов

SELECT p.*
     , pp.sellPrice
     , pp.*
FROM product AS p
LEFT JOIN product_price_group AS ppg
  ON p.id = ppg.productId
LEFT JOIN product_price AS pp
  ON ppg.id = pp.priceGroupId
WHERE p.active = 1
  AND p.id = 1
  AND pp.sellPrice =
    ( SELECT MIN(pp.sellPrice)
      FROM product_price
    )

для каждого продукта

SELECT p.*
     , pp.sellPrice
     , pp.*
FROM product AS p
LEFT JOIN product_price_group AS ppg
  ON p.id = ppg.productId
LEFT JOIN product_price AS pp
  ON ppg.id = pp.priceGroupId
JOIN
  ( SELECT priceGroupId
         , pp.MIN(pp.sellPrice) AS sellPrice
    FROM product_price
    GROUP BY priceGroupId
  ) AS ppmin
  ON  ppmin.priceGroupId = pp.priceGroupId
  AND ppmin.sellPrice = sellPrice
WHERE p.active = 1
  AND p.id = 1
1 голос
/ 14 апреля 2011

По некоторым предложениям я использовал атрибут GROUP BY, и следующий запрос работает правильно, если я хочу наименьшую цену на продажу для определенного продукта:

SELECT p.*, MIN(pp.sellPrice) AS sellPrice, pp.quantity, pp.`priceGroupId`
FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON ppg.productId = p.`id`
LEFT JOIN `product_price` AS pp ON pp.priceGroupId = ppg.`id`
WHERE p.`active` = 1 AND  p.id = 1 AND pp.sellPrice IS NOT NULL
GROUP BY pp.id;

Для всех продуктов:

SELECT p.*, MIN(pp.sellPrice) AS sellPrice, pp.quantity, pp.`priceGroupId`
FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON ppg.productId = p.`id`
LEFT JOIN `product_price` AS pp ON pp.priceGroupId = ppg.`id`
WHERE p.`active` = 1 AND pp.sellPrice IS NOT NULL
GROUP BY pp.id;
1 голос
/ 14 апреля 2011

То, что вы ищете, это все строки, в которых цена не ниже:

SELECT p.*, pp.sellPrice AS sellPrice, pp.* FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON p.`id` = ppg.`productId`
LEFT JOIN `product_price` AS pp ON ppg.`id` = pp.`priceGroupId`
WHERE p.`active` = 1 AND p.id = 1
   AND NOT EXISTS (SELECT 1 FROM product_price AS pp2
       WHERE pp2.productId = pp.productId AND pp2.sellPrice < pp.sellPrice)
GROUP BY productId;

Я немного угадал, какие ключи задействованы.Идея состоит в том, чтобы WHERE NOT EXISTS искал соответствующие строки с более низкими ценами.Таким образом, MySQL будет включать в ваши результаты только те строки, в которых он не может найти такое совпадение по «более низкой цене».

...