2012-04-29 83 views
0

嵌套查询的Noob问题。这个SQL查询有一点问题。请帮忙。尝试按月,年在同一个表和分组中计算2个字段。查询在新的和续订字段中返回相同的结果。MONTH的嵌套MYSQL组,年,

SELECT MONTH(p.created_at) as Month, YEAR(p.created_at) as Year, 
    (SELECT COUNT(p.id) FROM payments p 
INNER JOIN carts c ON c.payment_id = p.id 
INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id = 8) as 'New', 
    (SELECT COUNT(p.id) FROM payments p 
INNER JOIN carts c ON c.payment_id = p.id 
INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id = 13) as 'Renewal',  
FROM payments p 
GROUP BY month, year 

感谢您的帮助!

查询Expample

Month Year New Renewal 
1  2010 1169 556 
1  2011 1169 556 
1  2012 1169 556 
2  2010 1169 556 
2  2011 1169 556 
+0

提供一些示例数据,它会更容易回答。告诉我们这个查询的结果是什么,以及你希望得到的结果是什么。 – 2012-04-29 15:14:49

+0

是的,请向我们展示一些示例数据。另外,如果您取出子查询并自行运行,会发生什么?它看起来唯一的区别是'ci.item_id'是8或13,对吗?这是数据库中'new'或'renewal'的正确数字吗? – Daan 2012-04-29 15:31:42

+0

添加上述查询中的示例数据。 Item_id = 8是一个新的db,13是db中的更新。如果我拉一个简单的选择,而不添加第二个产品,所有的数据就像我想要的那样出来。看起来像@nishant回答下面 – tumolo 2012-04-30 11:21:26

回答

0

从看你的查询我猜你有一个项目表,包含各种可能的购买项目。其中item_id = 8对应于“新”产品,item_id = 13对应于“续订”。

项目与名为cart_items的关系表中的预期销售事件相关联。

但并非所有的购物车都有售,但我们只想看看实际售出的购物车,因此我们从付款表开始。

是否支付预期销售是通过填充payment_id记录在购物车表中。

付款代表已经售出的购物车,我们从付款中获得payments.id,我们将payment_id带到购物车表中,并将cart_id拿到cart_items表中,并获取已售出的实际物品,我们希望,如果ITEM_ID为8(“新”)/ 13(“重建”)

我们试图运行查询是分开算吧:

SELECT MONTH(p.created_at) as Month, 
     YEAR(p.create_at) as Year, 
     sum(if(ci.item_id = 8, 1, 0)) as New, 
     sum(if(ci.item_id = 13, 1, 0)) as Renewal 
    FROM payments p, 
     INNER JOIN carts c on c.payment_id = p.id 
     INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id in (8,13) 
GROUP BY month, year; 

我们得到了整个数据集,我们按照我们想要分组的字段进行分组,然后通过计算我们看到item_id = 8/item_id = 13的次数来计算它。

我可能误解了问题域名,请让我知道是否需要澄清或错误。

+0

谢谢你的上述查询,你完全理解..忘记了querys中的陈述。你能否在if语句中解释1,0? – tumolo 2012-04-30 11:20:55

+0

抱歉没有在这里检查一会儿。我们只想计算满足if条件的那个,所以我们将它们设置为1表示真,0表示假,然后当我们使用sum函数(而不是count)时,我们得到条件为真时的值的计数。这有帮助吗? – 2012-05-04 08:39:48