尝试查询以下内容 http://sqlfiddle.com/#!2/6934c/1 这样我就可以得到所有order_totals的总和,其中订单是price_group 1并且order_meta表中没有促销行。
请注意,这不是最好的数据库设计,但我需要更长时间地使用它。
答案 0 :(得分:0)
(SQL FIDDLE):
SELECT SUM(order_total)
FROM orders AS o
INNER JOIN order_meta AS om
ON o.id = om.order_id
WHERE om.type = 'price_group'
AND om.value = 1
AND o.id NOT IN
(
SELECT oms.id
FROM order_meta AS oms
WHERE oms.type = 'promo'
)
答案 1 :(得分:0)
SELECT SUM(o.order_total)
FROM orders o
LEFT JOIN order_meta om ON o.id = om.order_id
LEFT JOIN order_meta om2 on o.id = om2.order_id AND om2.type = 'promo'
WHERE om.type = 'price_group' AND om.value = 1 AND om2.type IS NULL
答案 2 :(得分:0)
根据我的理解,您要求只有price_group而不是促销代码的订单总和通过选择促销代码的顺序使用NOT EXISTS
尝试此订单,以便它不会包含在订单总和中
select *,SUM(order_total) from orders o
LEFT JOIN order_meta
om ON(o.id=om.order_id)
WHERE om.type ='price_group' AND om.value =1
AND NOT EXISTS
(SELECT 1 FROM order_meta
WHERE `type` ='promo' AND
order_id= o.id
)
GROUP BY o.id
以下是所有订单的总和,不包括具有促销代码的订单
select *,SUM(order_total) from orders o
LEFT JOIN order_meta
om ON(o.id=om.order_id)
WHERE om.type ='price_group' AND om.value =1
AND NOT EXISTS
(SELECT 1 FROM order_meta
WHERE `type` ='promo' AND
order_id= o.id
)
答案 3 :(得分:-1)
这应该这样做:
select sum(o.Order_total) as total
from orders o
inner join order_meta pm on pm.order_id = o.id
left join order_meta om on om.order_id = o.id and om.type = 'promo'
where pm.type = 'price_group'
and pm.value = 1
and om.Id is null
这应该有效,因为第一个连接+ where子句确保订单具有值为1的价格组元记录。第二个连接+ where子句中的空检查确保没有类型记录促销。