2015-12-03 47 views
0

好吧,我看了,我似乎无法找到答案,我真的需要一些帮助。MySQL查询计数的孙子与where子句

我有3个表:

m(id, name), p(id, m_id, name), t(id, p_id, date, type, status) 

它们加入为:

m.id = p.m_id 
p.id = t.p_id 

我需要在那里t.type =批准 通过m.id分组t.type的计数并通过p.id

这是我到目前为止,但我收到“子查询返回多行”错误或我只是得到应用于所有记录的总数。

SELECT 
      m.`id`, 
      m.`company`, 
      (SELECT COUNT(t.`type`) 
      FROM t 
      INNER JOIN p on p.`id`=t.`p_id` 
      INNER JOIN m on p.`m_id`= m.`id` 
      WHERE t.`type`='approved' GROUP BY m.`id`) AS `app` 
     FROM m 
      INNER JOIN p 
      ON m.`id` = p.`m_id` 
      INNER JOIN t 
      ON p.`id` = t.`p_id` 
     WHERE t.`date` BETWEEN '2015-11-01 00:00:00' AND NOW() 
     GROUP BY m.`id` 
     ORDER BY m.`company 

我完全失去了这里。

+0

如果你得到“子查询返回多行”,那么你必须纠正该子查询;单独证明查询,看看它是否给你预期的结果。 PS:你应该在你的文章中包含表格的结构。 –

回答

2

你可以尝试改变你的查询来使用COUNT代替,这将有助于避免子查询。类似下面的查询应该可以得到你想要的结果。

SELECT 
    m.`id`, 
    m.`company`, 
    COUNT(IF(t.`type` = 'approved', t.`type`, NULL)) AS `app`, 
    COUNT(IF(t.`type` = 'declined', t.`type`, NULL)) AS `dec` 
FROM m 
    INNER JOIN p 
     ON m.`id` = p.`m_id` 
    INNER JOIN t 
     ON p.`id` = t.`p_id` 
WHERE t.`date` BETWEEN '2015-11-01 00:00:00' AND NOW() 
    AND t.`type` IN ('approved', 'declined') 
GROUP BY m.`id` 
ORDER BY m.`company 
+0

不幸的是,我需要实际拥有3个COUNT(),每个都有自己的Where子句。 – VikingBlooded

+0

你能解释一下你的意思吗?你的意思是你想为不同的m和p显示不同的计数?如果是这样的话,你只需加上GROUP BY p.'id' – xangxiong

+0

因此,1个计数将是COUNT(t.id),其中t.type ='approved',另一个计数为COUNT(t.id )其中t.type =“拒绝”,另一个是COUNT(t.id),其中t.type =“pending”,每个使用相同的t.date之间。 – VikingBlooded