Mysql 多表SQL SELECT语句

Mysql 多表SQL SELECT语句,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我试图从两个表和项目中获得结果,如下所示,这两个表中有两个不同的规定。我们希望从具有完全相同字段的存档和项目中获取Designer、ProjectNum和total Amount。存档和项目有一个名为CustomerMail的字段,我想用它来排除名为Profile的不同表中的任何内容,该表名为CustomerMail,customerStatus为Cancelled。我还想从另一个名为changeorder的表中获取change_total,该表的ProjectNum与archive和proje

我试图从两个表和项目中获得结果,如下所示,这两个表中有两个不同的规定。我们希望从具有完全相同字段的存档和项目中获取Designer、ProjectNum和total Amount。存档和项目有一个名为CustomerMail的字段,我想用它来排除名为Profile的不同表中的任何内容,该表名为CustomerMail,customerStatus为Cancelled。我还想从另一个名为changeorder的表中获取change_total,该表的ProjectNum与archive和project相同

我首先使用了一个联合来将项目和归档文件结合在一起,并添加了代码来删除已取消的项目

 SELECT DISTINCT(designerName), 
        SUM(total), 
        SUM(amount) 
 FROM
 (
   SELECT DISTINCT(Building_designer) as designerName, 
          COUNT(DISTINCT(Project_Num))as total, 
          SUM(archive.total_amount) as amount 
   FROM `archive` 
   INNER JOIN profiles
     ON archive.customer_email = profiles.customer_email 
   WHERE profiles.customer_status != "Cancelled" 
   AND SUBSTRING(archive.Project_Num,1,2)=17 
   GROUP BY designerName 

   UNION 

   SELECT DISTINCT(Building_designer) as designerName, 
          COUNT(DISTINCT(Project_Num))AS total, 
          SUM(projects.total_amount) AS amount
   FROM `projects` 
   INNER JOIN profiles 
     ON projects.customer_email = profiles.customer_email 
   WHERE profiles.customer_status != "Cancelled" 
   AND SUBSTRING(projects.Project_Num,1,2)=17 
   GROUP BY designerName
 ) AS temp 
 GROUP BY designerName
我试图从名为changeorder的表中获取totalAMOUNT。是否最好再进行一次联接以包含该表

下面是一个示例,它在不将其添加到此语句的情况下工作

SELECT SUM(DISTINCT(change_total))
FROM `changeorder` 
WHERE SUBSTRING(project_num,1,2)=17

我之所以需要添加另外两个表,是因为它还跟踪取消的内容。因此,我需要总结与每个人相关的所有项目编号的变更总数。不到两个月前,我从Hello World开始编写代码

如果我理解正确,您需要三组数据: 1名设计师、ProjectNum和存档中的总金额 2设计师、项目数量和项目总金额 3变更通知单中的变更总金额

您希望从前两种情况中排除在不同表中取消客户状态的任何情况

如果这些都正确,请尝试:

SELECT a.Designer, a.ProjectNum, a.total_amount, 
        prjct.Designer, prjct.ProjectNum, prjct.total_amount,
        chgOrd.change_total
    -- the first two JOINs are to enable the WHERE later for knocking out
FROM archive a JOIN profiles prf ON a.customerEmail = prf.customerEmail, 
              projects prjct JOIN profiles prf ON prjct.customerEmail = prf.customerEmail
    -- then another (double) JOIN to link changeorder properly to archive and project
              changeorder chgOrd JOIN a ON chgOrd.ProjectNum = a.ProjectNum
                                  JOIN prjct ON chgOrd.ProjectNum = prjct.ProjectNum
 WHERE prf.customerStatus <> "Cancelled"
我希望我是对的,您可以使用在FROM开头创建的别名,并在其结尾的联接中使用它。

SQL如果格式化,调试起来会容易得多。因此,如果要按列进行分组,则不需要使用DISTINCTs