草庐IT

mysql - 连接 4 个表导致空结果

coder 2023-10-12 原文

我有 4 个表,每个表上都有这个细节

deli_order 表

order_code | code | plat_create_time | status
OC001        C001   2019-04-14    Success
OC002        C002   2019-04-14    Success
OC003        C003   2019-04-14    Success

pg_order 表

id |order_code | code | plat_create_time
1    OC001       C001   2019-04-14
2    OC002       C002   2019-04-14
3    OC003       C003   2019-04-14

pg_package 表

pg_order_id | plat_create_time | cm_sign_time
1                2019-04-14         2019-04-14
2                2019-04-14         2019-04-14
3                2019-04-14             -

pg_send_package 表

order_code | code | plat_create_time | lp_sign_time
OC001        C001   2019-04-14             -
OC002        C002   2019-04-14             -
OC003        C003   2019-04-14         2019-04-14

我需要计算具有“cm_sign_time”或“lp_sign_time”的交易数据。 pg_package 表需要先连接到 pg_order,然后才能连接到 deli_order 表。

首先,我首先尝试将 pg_send_package 表与 deli_order 表连接起来。这是我的查询

SELECT 
    DATE(A.create_time) AS 'Create Time',
    SUM(CASE
        WHEN B.lp_sign_time IS NOT NULL THEN 1
        ELSE 0
    END) AS 'Completed Order'
FROM
    deli_order A
INNER JOIN pg_send_package B ON B.order_code = A.order_code AND B.code = A.code
WHERE DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);

结果

Create Time | Completed Order
2019-04-14     130

但是当我加入另外两个表时,我得到的结果是什么都没有。这是我的查询

SELECT 
    DATE(A.plat_create_time) AS 'Create Time',
    SUM(CASE
        WHEN B.lp_sign_time IS NOT NULL THEN 1
        WHEN D.cm_sign_time IS NOT NULL THEN 1
        ELSE 0
    END) AS 'Completed Order'
FROM
    deli_order A
INNER JOIN pg_send_package B ON B.order_code = A.order_code AND B.code = A.code
INNER JOIN pg_order C ON C.order_code = A.order_code AND C.oms_code = A.code
INNER JOIN pg_package D ON D.pg_order_id = C.id
WHERE
    DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);

这是结果

Create Time | Completed Order

我需要对带有“lp_sign_time”或“cm_sign_time”的交易的计数结果求和。

我的预期结果是

Create Time | Completed Order
2019-04-14        150

150 来自带有“lp_sign_time”的 130 笔交易和带有“cm_sign_time”的 20 笔交易 我应该在查询中更改什么?

最佳答案

你可以尝试使用UNION ALL结合pg_send_packagepg_package表为order_code,code,lp_sign_time 然后使用 COUNT 执行 OUTER JOIN

SELECT DATE(A.plat_create_time) AS 'Create Time', 
       COUNT(lp_sign_time) AS 'Completed Order'
FROM deli_order A
LEFT JOIN
(
    SELECT order_code, 
           code, 
           lp_sign_time
    FROM pg_send_package psp
    UNION ALL
    SELECT C.order_code, 
           C.code, 
           pp.cm_sign_time
    FROM pg_package pp
         INNER JOIN pg_order C ON pp.pg_order_id = C.id
) t1 ON t1.order_code = A.order_code
        AND t1.code = A.code
        AND DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);

关于mysql - 连接 4 个表导致空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55827623/

有关mysql - 连接 4 个表导致空结果的更多相关文章

  1. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  2. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  3. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  4. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  5. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  6. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  7. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

  8. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  9. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  10. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

随机推荐