2011-01-10 2 views
2

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

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

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.

Любые предложения?

ответ

0

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

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 
+0

К сожалению, это не так просто. Я бы использовал соединения, но на самом деле есть четыре подзапроса - каждый из них проверяет различные типы возможных скидок. Мне казалось невозможным структурировать соединения таким образом, чтобы не требовать, чтобы каждый продукт имел все четыре соединения. Подзапросы облегчают/облегчают это условие. Думаю, я буду играть с ними больше. – helion3

0

Вы группируете только по продукту, а подзаголовок фактически возвращает три значения (по одному для каждого купона продукта). Я бы действительно ожидал, что этот запрос вернет ошибку. Вы должны либо переместить скидку на один уровень вверх, либо переместить купоны в подзапрос. Пример первого (подзапросы, как правило, медленнее в 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 
Смежные вопросы