依靠缺少零计数的多个表

时间:2015-12-29 15:01:57

标签: mysql database

我正在运行此查询以返回带有count<的数据它工作正常,直到计数为> 0和<但是当count变为0时,它不会返回数据。计数由coupons`.`status定义。在计数为零的情况下,coupons表中没有数据status为1.这就是创建问题,因为它省略了整行。

SELECT count(*) AS count, clients.title, plans.name 
FROM `coupons`
    INNER JOIN `clients` ON `coupons`.`client_id` = `clients`.`id`  
    INNER JOIN `plans` ON `coupons`.`plan_id` = `plans`.`id`
WHERE `coupons`.`status` = 1
GROUP BY `coupons`.`client_id`, `coupons`.`plan_id` 
HAVING count < 50

请帮助解决问题。

表定义。

coupons (id, client_id, plan_id, customer_id, status, code)
plans (id, name)
clients (id, name...)
client_plans (id, client_id, plan_id)

基本上,客户可以有多个计划,计划可以属于多个客户。

优惠券表存储可以分配给客户的预定义优惠券。未分配的优惠券的状态为0,而已分配的优惠券的状态为1

在这里,我试图获取未分配的客户端,计划明智的优惠券计数,其中计数小于50或计数已达到0

例如,

如果优惠券表为10行client_id = 1&amp; plan_id = 1,状态为1,它应该将count返回为10,但是当表有0行且client_id = 1且plan_id = 1且状态为1时,它不会返回上述查询中的任何内容。

2 个答案:

答案 0 :(得分:0)

使用内部联接,查询不会返回任何“零”计数。

如果要返回“零”计数,则需要在某处进行外连接。

但目前尚不清楚你究竟想要计算什么。

假设您要获取的内容是来自 coupons 的行数,对于来自 plans 的所有行的可能组合, clients ,您可以这样做:

SELECT COUNT(`coupons`.`client_id`) AS `count`
     , clients.title
     , plans.name
  FROM `plans`
 CROSS 
  JOIN `clients`
  LEFT
  JOIN `coupons`
    ON `coupons`.`client_id` = `clients`.`id`
   AND `coupons`.`plan_id`   = `plans`.`id`  
   AND `coupons`.`status`    = 1
 GROUP
    BY `clients`.`id`
     , `plans`.`id`
HAVING `count` < 50

这只是对您期望返回的结果集的猜测。缺少表定义,示例数据和预期结果,我们只是在猜测。

<强>后续

根据您的评论,听起来您需要条件聚合。

要“计算”couponsstatus=1的行,您可以执行以下操作:

SELECT SUM( `coupons`.`status` = 1 ) AS `count`
     , clients.title
     , plans.name
  FROM `coupons`

  JOIN `plans`
    ON `plans`.`id` = `coupons`.`plan_id`

  JOIN `clients`
    ON `clients`.`id` = `coupons`.`client_id`

 GROUP
    BY `clients`.`id`
     , `plans`.`id`

HAVING `count` < 50

您可以使用其他表达式来获取条件“计数”。例如

SELECT COUNT( IF(`coupons`.`status`=1, 1, NULL) ) AS `count` 

SELECT SUM( IF(`coupons`.`status`=1, 1, 0) ) AS `count`

或者,对于更符合ANSI标准的方法

SELECT SUM( CASE WHEN `coupons`.`status` = 1 THEN 1 ELSE 0 END ) AS `count`

答案 1 :(得分:0)

感谢大家的投入,这很有效。

select 
    sum(CASE WHEN `coupons`.`status` = 1 THEN 1 ELSE 0 END) as count,     
    clients.title, 
    plans.name 
from 
    `clients` 
left join 
    `coupons` 
on 
    `coupons`.`client_id` = `clients`.`id` 
left join 
    `plans` 
on 
    `coupons`.`plan_id` = `plans`.`id` 
group by 
    `coupons`.`client_id`, 
    `coupons`.`plan_id` 
having 
    count < 50