我正在运行此查询以返回带有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时,它不会返回上述查询中的任何内容。
答案 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
这只是对您期望返回的结果集的猜测。缺少表定义,示例数据和预期结果,我们只是在猜测。
<强>后续强>
根据您的评论,听起来您需要条件聚合。
要“计算”coupons
中status=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