【问题标题】:Which join should I use for this mysql query?我应该为这个 mysql 查询使用哪个连接?
【发布时间】:2019-10-16 23:12:10
【问题描述】:

我有一个表“PR”,它有一个特定的 TraceID,另一个名为“BA”的表有一个“PAYMENT_ID”和(有时)一个 TraceID 值,我必须从“MISC”列中提取它然后匹配 BA和 PR Trace_ID。

现在,BA 中的一些记录在提取后没有 TraceID,但我仍然需要这些记录显示为行。

公关表:

TraceID
178000
178001
178002
178003

BA 表

PAYMENT_ID, MISC
100, AAA/TraceID=178000
101, BBB/TraceID=178001
102, Ref
103, CCC/TraceID=178002
104, Ref2
105, CCC/TraceID=178003

我的输出应该是:

TraceID, PAYMENT_ID
178000, 100
178001, 101
NULL, 102
178002, 103
NULL, 104

等等。

我使用这个查询:

   select * from
    (select TraceID from PR) PR
    left join 
    (select 
     PAYMENT_ID , if (locate('TraceId=',MISC)>0,SUBSTRING_INDEX(MISC,'TraceId=',-1),'') as traceID from BankingActivity ) BA
     on PR.TraceID = BA.traceID  

我只在 BA 中获得具有匹配 TraceID 的 PR 行。

现在,我应该如何修改查询以从 BA 获取所有 PR 记录及其对应的 PAYMENT_ID(具有相同的 TraceID),以及从 BA 获取没有匹配 TraceID 的所有 PAYMENT_ID 行?

我想我应该有一种 UNION 然后加入,但我所有的尝试都失败了

感谢您的建议。

【问题讨论】:

  • 我不明白这个问题,你能提供示例输入和期望的结果吗?
  • 如果没有人能理解你,也没有人能帮助你。
  • 我添加了数据以供澄清

标签: mysql outer-join


【解决方案1】:

您真正想要的是RIGHT JOIN,或者,先用BA 表重写查询:

SELECT BA.PAYMENT_ID, PR.*
FROM (SELECT PAYMENT_ID,
      IF (LOCATE('TraceId=',MISC)>0,SUBSTRING_INDEX(MISC,'TraceId=',-1),'') AS traceID
      FROM BankingActivity) BA
LEFT JOIN PR ON PR.TraceID = BA.traceID

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2013-03-09
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多