MySQL максимальное значение из подзапроса и группы по проблеме - PullRequest
2 голосов
/ 10 января 2011

У меня есть три таблицы, которые мы представим, они называются продуктами, купонами и скидками. У меня есть запрос, который пытается получить список продуктов и выполняет подзапрос, чтобы найти ЛЮБЫЕ купоны с действительной скидкой.

Например, это показывает, что я пытаюсь:

SELECT products.id, products.name, 
 (
 SELECT MAX(discounts.amount) FROM discounts
 WHERE discounts.coupon_id = coupons.id
 LIMIT 1
 ) as discount
FROM products
LEFT JOIN coupons ON products.id = coupons.product_id
GROUP BY products.id

Моя проблема в том, что мой GROUP BY необходим по многим другим причинам. Но если для каждого продукта существует несколько купонов, «скидка» комбинируется странным образом, когда происходит группировка.

Допустим, для одного продукта есть три купона - два без скидки и один со скидкой 33%. Когда происходит группировка по, я хочу выбрать самое высокое значение, но по умолчанию MySQL возвращает значение как 0.

Использование MAX является подзапросом, очевидно, только возвращает максимальную величину скидок для каждого отдельного купона. Мне просто нужно сказать GROUP BY использовать максимальное значение.

Я мог бы легко использовать GROUP_CONCAT для возврата строки всех из них, но мне также нужно использовать это значение в расчете в некоторых условиях HAVING.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 января 2011

Вы группируете только по productid, в то время как подвыбор фактически возвращает три значения (по одному для каждого купона продукта). Я действительно ожидал бы, что этот запрос вернет ошибку. Вы должны либо переместить скидку на один уровень выше, либо переместить купоны в подсекцию. Пример первого (подзапросы обычно медленнее в MySQL):

select
  p.productid,
  max(d.discount) as discount
from
  product p
  left join coupon c on c.productid = p.productid
  left join discount d on d.couponid = c.couponid
group by
  p.productid
0 голосов
/ 10 января 2011

Я не думаю, что вы хотите или нуждаетесь в подзапросе.Что это возвращает для вас?

SELECT products.id, products.name, MAX(discounts.amount) AS discount
FROM products
LEFT JOIN coupons ON products.id = coupons.product_id
LEFT JOIN discounts ON coupons.id = discounts.coupon_id
GROUP BY products.id
...