Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将多个mysql查询重构为1_Php_Mysql_Pdo_Erd - Fatal编程技术网

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更新的查询,请让我知道这是否适用于您