需要MYSQL查询 - 将4个表连接到一个表中

时间:2012-12-25 15:19:40

标签: mysql select join union

以下是我的数据库的架构。我迫切需要一个查询。已经工作了好几天但没有得到正确的结果。

TABLE: CUSTOMERINFORMATION  
FIELDS: CUSTID, ACTOPTIONID,VAT,MINIMUMDOCT 

TABLE: ONLINEORDERS 
FIELDS: CUSTID, TOTALQUANTITY 

TABLE: OFFLINEORDERS
FIELDS: CUSTID, TOTALQUANTITY 

TABLE: ACTOPTS 
FIELDS: ACTOPTIONID,ACTNAME 

输出就像这样: TEMPORARY TABLE:CUSTID,ACTOPTIONID,TOTALONLINEQ,TOTALOFFLINEQ,ACTNAME

我需要将所有上述表和提到的字段组合到ONE TABLE中。 我们还需要确保返回NULL行;意味着UNION ALL适用于以上所有。

有人可以帮帮我吗?我已经花了好几天试图解决它,但不知何故无法获得正确的结果集。

这是为了创建一个数据导出实用程序,其中所有上述内容都将导出到另一个表中。但是,如果表格中没有与其他人相匹配的记录,我们需要确保不排除任何记录。

谢谢!!!!!

EDITED

以下是我的查询

SELECT table1.*, table2.*, table3.*
  FROM (SELECT ao.actname,
               ci.custid,
               ci.actoptionid,
               ci.minimumdoct,
               ci.vat
          FROM customerinformation ci, actoptions ao
         WHERE ci.actoptionid = ao.actoptionid) table1
       LEFT JOIN (SELECT custid, totalquantity, FROM onlineorders) table2
          ON table1.custid = table2.custid
       LEFT JOIN (SELECT custid FROM offlineorders) table3
          ON table2.custid = table3.custid

但是,上面的内容不会返回RIGHT表格中的行。我想从桌子右边返回ROWS,为此我想我需要在所有这些上使用UNION。我该怎么做?

4 个答案:

答案 0 :(得分:1)

SELECT
*
FROM
`CUSTOMERINFORMATION`
LEFT OUTER JOIN
`ONLINEORDERS` ON (`CUSTID`)
LEFT OUTER JOIN
`OFFLINEORDERS` ON (`CUSTID`)
LEFT OUTER JOIN
`OFFLINEORDERS` ON (`ACTOPTS`)

答案 1 :(得分:0)

你想要这个吗?

    SELECT CI.CUSTID,
          CI.VAT,
          CI.MINIMUMDOCT,
          ONL.TOTALQUANTITY as ONLINE_TOTALQUANTITY,
          OFF.TOTALQUANTITY as OFFLINE_TOTALQUANTITY,
          A.ACTNAME 
   FROM CUSTOMERINFORMATION CI
        LEFT JOIN ACTOPTS A
          ON CI.ACTOPTIONID = A.ACTOPTIONID
        LEFT JOIN ONLINEORDERS ONL
          ON CI.CUSTID = ONL.CUSTID
        LEFT JOIN OFFLINEORDERS OFF
          ON CI.CUSTID = OFF.CUSTID

答案 2 :(得分:0)

试试这个:

SELECT CI.CUSTID, CI.ACTOPTIONID, O.TOTALQUANTITY TOTALONLINEQ, 
       O1.TOTALQUANTITY TOTALOFFLINEQ, A.ACTNAME, 
       (O.TOTALQUANTITY + O1.TOTALQUANTITY) TotalQuantity  
FROM CUSTOMERINFORMATION CI 
INNER JOIN ACTOPTS A ON CI.ACTOPTIONID = A.ACTOPTIONID
LEFT JOIN (SELECT * FROM (SELECT CUSTID, TOTALQUANTITY FROM ONLINEORDERS ORDER BY DATE DESC) ASs A GROUP BY CUSTID) O ON CI.CUSTID = O.CUSTID 
LEFT JOIN (SELECT * FROM (SELECT CUSTID, TOTALQUANTITY FROM OFFLINEORDERS ORDER BY DATE DESC) ASs A GROUP BY CUSTID) O1 ON CI.CUSTID = O1.CUSTID;

答案 3 :(得分:0)

如果您希望FULL JOINLEFT

匹配,请尝试使用RIGHT

作为旁注,UNION命令加入两个SELECT语句,这些语句在当前表单中没有。如果您想使用UNION,则应将语句重新排序为SELECT ... UNION SELECT ...