查询不存在特定键值行的连接

时间:2013-12-04 20:21:48

标签: mysql

尝试查询以下内容 http://sqlfiddle.com/#!2/6934c/1 这样我就可以得到所有order_totals的总和,其中订单是price_group 1并且order_meta表中没有促销行。

请注意,这不是最好的数据库设计,但我需要更长时间地使用它。

4 个答案:

答案 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

See Demo here

以下是所有订单的总和,不包括具有促销代码的订单

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
)

Demo All Orders

答案 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子句中的空检查确保没有类型记录促销。