如果没有找到记录,Mysql 复杂查询生成计数为零的所有表

Posted

技术标签:

【中文标题】如果没有找到记录,Mysql 复杂查询生成计数为零的所有表【英文标题】:Mysql Complex query for generate all table with count zero if no records found 【发布时间】:2017-12-01 08:26:16 【问题描述】:

我有一个复杂的查询。我被冻结了:(。 这是我的桌子。 用户:

CREATE TABLE `users` (
  `id` tinyint(4) NOT NULL,
  `office_name` varchar(255) DEFAULT NULL,
  `district_id` int(10) DEFAULT NULL,
  `upazilla_id` int(10) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `mobile` varchar(11) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(100) NOT NULL,
  `type` varchar(10) NOT NULL,
  `del_status` tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `service` (
  `id` int(10) NOT NULL,
  `recipient_number` int(50) NOT NULL,
  `date` date NOT NULL,
  `office_id` int(10) NOT NULL,
  `del_status` tinyint(1) NOT NULL,
  `creation_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `service_list` (
  `id` int(3) NOT NULL,
  `service_name` varchar(50) NOT NULL,
  `del_status` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `service_transaction` (
  `id` int(10) NOT NULL,
  `service_transaction_id` int(50) NOT NULL,
  `service_id` int(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这里,service-id = service_transaction.service_transaction_id。

我写了一个查询:

select users.id, users.office_name,service_transaction.service_id , COUNT(service_transaction.service_id) as service_total
from users
LEFT JOIN service on users.id = service.office_id
LEFT JOIN service_transaction on service_transaction.service_transaction_id = service.id
WHERE( users.del_status = 0 and users.type='agency')
GROUP BY users.office_name , users.id, service_transaction.service_id 

返回:

id   office_name  Service_id  service_total
=============================================
2    Ctg Office      2             2
2    Ctg Office      3             4
2    Ctg Office      4             3
7    Dhaka Office   NULL           0

但我的愿望输出是:

id   office_name  Service_id  service_total
=============================================
2    Ctg Office      2             2
2    Ctg Office      3             4
2    Ctg Office      4             3
2    Ctg Office      5             0
2    Ctg Office      6             0

7    Dhaka Offc      2             0
7    Dhaka Offc      3             0
7    Dhaka Offc      4             0
7    Dhaka Offc      5             0
7    Dhaka Offc      6             0

这意味着,我要显示每个办公室下的所有服务,如果没有服务,计数应该为零。

【问题讨论】:

所以您的表users 包含办公室。用户是模型中的办公室。不过,在我看来,您最好将表格称为officesservice 表包含为办公室定义的服务,即 office=2|service=2、office=2|service=3 等。您也想为 office=2|service=6 显示一行。 services 中是否存在这样的记录,即是否为办公室 2 定义了服务 6? 无论如何,您应该按service.id 分组,而不是按service_transaction.service_id。也许这已经解决了你的问题。 请从表中显示一些虚拟数据或创建小提琴 【参考方案1】:
select users.id, users.office_name,service_transaction.service_id , COUNT(service_transaction.service_id) as service_total
from users
JOIN service 
LEFT JOIN service_transaction on service_transaction.service_transaction_id = service.id
WHERE( users.del_status = 0 and users.type='agency')
GROUP BY users.office_name , users.id, service_transaction.service_id 

试试上面的查询。

【讨论】:

嗨,Sagar,这不起作用。我之前也写过同样的查询。示例:“Office Dhaka”显示与“Ctg office”相同的服务总额。但是“达卡办事处”没有数据,所以,达卡办事处的所有服务计数应该是 0【参考方案2】:
select temp.id office_id , temp.office_name, temp.svcic ,count(service_transaction.service_id) as service_total, count(recipient.id) as total_count from (select users.id, users.office_name ,service_list.id svcic from users,service_list WHERE users.del_status = 0 and users.type='agency' )  temp LEFT JOIN service on temp.id = service.office_id and service.del_status=0 LEFT JOIN service_transaction on service_transaction.service_id = temp.svcic and service_transaction.service_transaction_id=service.id right outer JOIN recipient on recipient.office_id = temp.id group by temp.id , temp.office_name, temp.svcic ORDER BY temp.id,temp.office_name

请试试上面的代码。 为了更具可读性,您应该保持意图

【讨论】:

【参考方案3】:

如果不能解决,试试这个,然后让我知道表服务和 service_transaction 表中的数据。

选择 users.id, users.office_name,service_transaction.service_id , SUM(IF(service.id IS NULL, 0, 1)) as service_total

来自用户

在 users.id = service.office_id 上加入服务

在 service_transaction.service_transaction_id = service.id 上加入 service_transaction

WHERE(users.del_status = 0 and users.type='agency')

GROUP BY users.office_name , users.id, service_transaction.service_id

【讨论】:

嗨@Jack,我的目标是展示所有办公室。尽管许多办公室的服务表上可能没有任何条目。这种情况下,他们的输出如下: Dhaka office [service_name]->1 [service-count]->0

以上是关于如果没有找到记录,Mysql 复杂查询生成计数为零的所有表的主要内容,如果未能解决你的问题,请参考以下文章

如何对唯一查询进行复杂计数

如何按月份或年份计数和分组,月份为零

Codeigniter Active Record - 计算找到的总行数(MySQL)

在 groupBy 选择后计算总记录数

如果没有记录计数,则显示零 - ORACLE SQL 查询

复杂 SQL 计数查询