将多个mysql查询重构为1

时间:2017-08-14 12:25:44

标签: php mysql pdo erd

我目前正在开发一个系统,为客户生成各种报告,我需要指向方向,以达到我需要的目的。

目前的情况是,我需要对未完成的任务进行概述(以及剩余的一些细节)。

到目前为止,我已创建了目前所有任务的列表(包括有关客户的信息),这是通过以下查询实现的:

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_mail表)。如果没有为此任务找到邮件记录,那么我仍然想要显示它(因此另一个正确的连接是不可能的。

我还需要对fusion_response表执行相同的操作,以检查客户是否已发送回复。如果他们还没有,那么我仍然想要显示任务。

显然我知道我可以通过在主选择查询中运行查询来实现这一点,但这并不是我的理解。有没有办法可以在1个查询中执行此操作?

Entity Relationship Diagram 谢谢。

1 个答案:

答案 0 :(得分:1)

将您的查询结构更改为仅使用左连接 - 基本上与右连接相同,但不必在左右连接之间切换。

您加入客户进行维修的事实告诉我客户是主要的表格,所以现在我们可以说从客户那里得到所有东西,如果有记录就加入维修。

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

在这里我们可以使用左外连接来查看我们是否有任何邮件,如果没有,请不要删除该行,并且同时使用响应

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