Php 将多个mysql查询重构为1
我目前正在开发一个系统,为客户生成各种报告,我需要指出方向,以实现我所需要的 目前的情况是,我需要概述尚未完成的任务(以及关于剩余任务的一些细节) 到目前为止,我已经创建了到目前为止所有任务的列表(包括有关客户的信息),这是通过以下查询实现的:Php 将多个mysql查询重构为1,php,mysql,pdo,erd,Php,Mysql,Pdo,Erd,我目前正在开发一个系统,为客户生成各种报告,我需要指出方向,以实现我所需要的 目前的情况是,我需要概述尚未完成的任务(以及关于剩余任务的一些细节) 到目前为止,我已经创建了到目前为止所有任务的列表(包括有关客户的信息),这是通过以下查询实现的: SELECT `fusion_repairs`.*, `fusion_customers`.* FROM `fusion_repairs` RIGHT JOIN `fusion_customers` ON `fusion_repairs`.`cust
SELECT `fusion_repairs`.*, `fusion_customers`.*
FROM `fusion_repairs`
RIGHT JOIN `fusion_customers`
ON `fusion_repairs`.`customer_id` = `fusion_customers`.`customer_id`
ORDER BY `fusion_repairs`.`repair_id`
DESC LIMIT 20
理想情况下,我需要能够检查客户是否收到了关于任务的电子邮件(fusion\u mail
table)。如果没有找到此任务的邮件记录,那么我仍然希望显示它(因此,不可能有另一个正确的加入)
我还需要对fusion\u response
表执行相同的操作,以检查客户是否发送了响应。如果他们没有发送响应,那么我仍然希望显示任务
显然,我知道我可以通过在主select查询中运行一个查询来实现这一点,但这在我的脑海中并不太清楚。有没有一种方法可以在一个查询中实现这一点
谢谢。将查询结构更改为仅使用左连接-基本上与右连接相同,但不必在左连接和右连接之间交换 您将客户加入到维修中这一事实告诉我客户是主表,因此现在我们可以说从客户那里获取所有信息,如果存在记录,请加入维修
SELECT `fusion_repairs`.*, `fusion_customers`.*
FROM `fusion_customers`
LEFT OUTER JOIN `fusion_repairs` ON `fusion_repairs`.`customer_id` = `fusion_customers`.`customer_id`
ORDER BY `fusion_repairs`.`repair_id`
DESC LIMIT 20
在这里,我们可以使用leftouterjoin查看是否有邮件,如果没有,请不要删除该行,并将其与response一起删除
SELECT `fusion_repairs`.*, `fusion_customers`.*
FROM `fusion_customers`
LEFT OUTER JOIN `fusion_repairs` ON `fusion_repairs`.`customer_id` = `fusion_customers`.`customer_id`
LEFT OUTER JOIN `fusion_mail` ON `fusion_mail`.`repair_id` = `fusion_repairs`.`repair_id`
LEFT OUTER JOIN `fusion_response` ON `fusion_response`.`repair_id` = `fusion_repairs`.`repair_id`
ORDER BY `fusion_repairs`.`repair_id`
DESC LIMIT 20
现在我的问题是..你想要返回什么?如果有5个邮件记录,那么1个修复记录将有5个记录。你只需要一个“是/否”的勾号就可以说他们有一个相关的子查询,然后在主选择中可能是你想要的,或者一个分组,然后计算一个案例中要勾号的邮件数
让我知道您想要什么作为完成查询的输出
编辑:
我对查询进行了更新,以考虑到您提供给我的信息。请注意,我不知道您希望如何输出最终结果,所以我只是做了一个猜测!让我知道这是否解决了问题,否则请返回绘图板
SELECT fusion_repairs.*,
fusion_customers.*,
CONCAT( CASE WHEN fusionMail.mail_type_A > 0 THEN 'displayA' ELSE '' END,
CASE WHEN fusionMail.mail_type_B > 0 THEN 'displayB' ELSE '' END,
CASE WHEN fusionMail.mail_type_C > 0 THEN 'displayC' ELSE '' END) as email_font_awesome_icon,
CONCAT( CASE WHEN fusionResponse.response_status_A > 0 THEN 'displayA' ELSE '' END,
CASE WHEN fusionResponse.response_status_B > 0 THEN 'displayB' ELSE '' END,
CASE WHEN fusionResponse.response_status_C > 0 THEN 'displayC' ELSE '' END) as response_font_awesome_icon
FROM fusion_customers
LEFT OUTER JOIN fusion_repairs ON fusion_repairs.customer_id = fusion_customers.customer_id
LEFT OUTER JOIN (
SELECT repair_id,
SUM(CASE WHEN mail_type = 1 THEN 1 else 0 END) AS mail_type_A,
SUM(CASE WHEN mail_type = 2 THEN 1 else 0 END) AS mail_type_B,
SUM(CASE WHEN mail_type = 3 THEN 1 else 0 END) AS mail_type_C
FROM fusion_mail
GROUP BY repair_id
) fusionMail ON fusionMail.repair_id = fusion_repairs.repair_id
LEFT OUTER JOIN (
SELECT repair_id,
SUM(CASE WHEN response_status = 1 THEN 1 else 0 END) AS response_status_A,
SUM(CASE WHEN response_status = 2 THEN 1 else 0 END) AS response_status_B,
SUM(CASE WHEN response_status = 3 THEN 1 else 0 END) AS response_status_C
FROM fusion_response
GROUP BY repair_id
) fusionResponse ON fusionResponse.repair_id = fusion_repairs.repair_id
基本上,在邮件表中有一种邮件类型,可以是(联系人、提醒或返回)。我只想为每种类型显示一个字体很棒的图标。@LewisBrowne您希望每次修复只发送一封电子邮件还是多次发送?您介意每封电子邮件发送多行以便一次修复可以发送多行吗?您是否希望每种类型发送一列,如果是那种类型,请在其中加上勾号/叉号?需要更多详细信息!(这甚至还不包括回复!)基本上每个修复都可以有无限量的电子邮件,但是我想知道修复是否有包含
email\u类型
的电子邮件(联系、提醒或返回)。如果修复有全部3个,则我将呈现3个邮件图标;如果修复有2个邮件,则它将呈现2;如果修复只有1个,则它将仅呈现1。对于响应,也将完全相同。@LewisBrowne更新的查询,请让我知道这是否适用于您