如果没有找到记录,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
包含办公室。用户是模型中的办公室。不过,在我看来,您最好将表格称为offices
。 service
表包含为办公室定义的服务,即 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 复杂查询生成计数为零的所有表的主要内容,如果未能解决你的问题,请参考以下文章