【问题标题】:MYSQL query to join four tables into one tableMYSQL查询将四张表连接成一张表
【发布时间】:2012-12-11 11:54:13
【问题描述】:

以下是我的数据库的架构。我一直在处理查询,但无法获得正确的结果。

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

TABLE: ONLINEORDERS 
FIELDS: CUSTID, TOTALQUANTITY 

TABLE: OFFLINEORDERS
FIELDS: CUSTID, TOTALQUANTITY 

TABLE: ACTOPTS 
FIELDS: ACTOPTIONID,ACTNAME 

这样的输出: 临时表:CUSTID、ACTOPTIONID、TOTALONLINEQ、TOTALOFFLINEQ、ACTNAME

我需要将上述所有表格和提到的字段合并到一个表格中。 我们还需要确保返回 NULL 行;表示以上所有内容的 UNION ALL。

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

已编辑

以下是我的查询:

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 ALL。我该怎么做?

【问题讨论】:

  • 你试过什么?您是否听说过 FULL OUTER JOIN 以及如何在 MySQL 中使用 LEFT JOINs、RIGHT JOINs 和 UNION 的组合来模拟它?
  • 是的,我查看了这个网站并了解了 LEFT、RIGHT 和 UNION ALL 来模拟 FULL OUTER JOIN。让我编辑问题并分享我的查询。我应该早点分享的。
  • 好的,我已编辑问题以包含我当前的查询。请看一看。谢谢
  • 你说“右边的桌子”是什么意思?了解您需要什么的最简单方法是提供样本数据和结果取决于此。

标签: mysql select join union


【解决方案1】:
SELECT
*
FROM
`CUSTOMERINFORMATION`
LEFT OUTER JOIN
`ONLINEORDERS` ON (`CUSTID`)
LEFT OUTER JOIN
`OFFLINEORDERS` ON (`CUSTID`)
LEFT OUTER JOIN
`OFFLINEORDERS` ON (`ACTOPTS`)

【讨论】:

  • 好的,我已编辑问题以包含我当前的查询。请看一看。谢谢
【解决方案2】:

试试这个:

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;

【讨论】:

  • 感谢您的回答。以上是否不排除右表中不匹配的行????我暂时不想排除它们。
  • 您的主表是客户,所有其他表(如在线订单和离线订单)都有客户表中存在的信息
  • 您想要记录客户还是订单?我认为在线订单和离线订单表包含 1 个客户的多个条目。我是对还是错?
  • 是的,在线和离线订单中的每个订单都有多个条目。我希望针对每个 custid 返回记录我还编辑了问题以显示我的当前查询
  • 检查我更新的答案,让我知道它是否有效。据我了解,您希望以这种格式输出
【解决方案3】:

你想要这个吗?

    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

【讨论】:

  • 谢谢哈姆雷特。对不起,我是 SQL 的新手。我不需要使用连接吗?我之前的查询使用了 LEFT JOIN,但是我从右边的表中丢失了行。然后我使用了 RIGHT JOIN,反之亦然。然后,我决定对两者都进行 UNION ALL,但出现语法错误,这就是我发布问题的时候。
  • 你能提供一个简短的测试数据和你想要达到的结果吗?
  • 顺便说一句,作为与当前主题相关的旁白,以下数字是否告诉我有关数据的一些信息?我很抱歉,但我正在学习 ONLINEORDER 中的 SQL 总记录:OFFLINEORDER 中的总记录数:10,000 总记录:10,000 当我使用 LEFT JOIN 时,我得到带有 10472 条记录的结果集,当我使用 RIGHT JOIN 时,我得到带有 10003 条记录和内部连接的结果集,我得到 903 条记录下面告诉我一些关于数据的事情?如丢失记录和数据完整性?谢谢
  • 我尝试了您提供的查询。它以行方式呈现。例如,首先我从 CUSTOMERINFORMATION 获取所有行,然后从 ONLINEORDER 等获取所有行。当某些字段没有匹配的行时,我的输出应该是这样的 CUSTID、ACTOPTIONID、TOTALONLINEQUANTITY、TOTALOFFLINEQUANTITY、ACTNAME,这些字段应该是空白并显示为 NULL .
  • 好的,我已编辑问题以包含我当前的查询。请看一看。谢谢
【解决方案4】:

如果您想在 LEFTRIGHT 表上进行匹配,请尝试使用 FULL JOIN

作为旁注,UNION 命令连接了两个 SELECT 语句,而您在当前形式中没有这些语句。如果您想使用UNION,那么您应该将您的语句重新排序为SELECT ... UNION SELECT ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多