MySQL查询计数的孙子用where子句

时间:2015-12-03 16:03:35

标签: mysql

好的,我看了,我似乎无法找到答案,我真的需要一些帮助。

我有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的计数,其中t.type = approved 按m.id和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

我完全迷失在这里。

1 个答案:

答案 0 :(得分: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
相关问题