【问题标题】:trouble query for join two table连接两个表的麻烦查询
【发布时间】:2015-10-05 09:02:28
【问题描述】:

我有两张桌子,我的第一张桌子是piutang

------------------------------------------------
id    nmr_bukti     tgl_transaksi   customer_id
------------------------------------------------
1     2015RSV0001   2015-09-17      42
2     2015RSV0002   2015-09-17      42
------------------------------------------------

还有第二张表invoice_detail

------------------------------------------------
id    invoice_id     customer_id      nmr_bukti
------------------------------------------------
1     1              42               2015RSV0001       
2     1              42               2015RSV0001       
------------------------------------------------

我想在条件 customer_id=42 的情况下得到这样的结果

------------------------------------------------
id    nmr_bukti     tgl_transaksi customer_id      
------------------------------------------------
1     2015RSV0002   2015-09-17            42               
------------------------------------------------

我该如何查询这个案例?

【问题讨论】:

  • 您的两个表都有 nmr_bukti = '2015RSV0001' for id = 1.. 那么为什么 nmr_bukti = '2015RSV0002' for id = 1 在您想要的结果中?
  • 通缉结果中的id列是piutang还是invoice_detail的id列?
  • 我开始认为 none 两者都不是,id 实际上是 row_number :)
  • 获得结果的最简单方法是select * from piutang where nmr_bukti = '2015RSV0002'。这是你想要的吗?如果不是,您希望根据什么规则选择此记录?
  • 还有一个问题:两个表都有一个 customer_id。为什么?它是钥匙的一部分吗?在两个表中的任何一个表中都可以存在具有不同 customer_id 的相同 nmr_bukti 吗?如果是这样,这对结果有何影响?

标签: mysql sql join where


【解决方案1】:

您可以使用以下查询-

SELECT DISTINCT p.id, p.tgl_transaksi, p.customer_id 
FROM piutang AS p 
LEFT JOIN invoice_detail AS id 
ON p.customer_id=id.customer_id 
AND p.nmr_bukti=id.nmr_bukti 
WHERE p.customer_id = 42
AND id.id is null;

注意:为了获得更好的性能 customer_id 和 mnr_bukti 字段应该被索引。

【讨论】:

    【解决方案2】:

    试试-

    SELECT * FROM piutang
    WHERE nmr_bukti NOT IN
        (SELECT DISTINCT nmr_bukti
        FROM invoice_detail
        WHERE customer_id = 42)
    AND customer_id = 42;
    

    【讨论】:

    • 它与 SELECT * FROM piutang WHERE nmr_bukti NOT IN (SELECT DISTINCT nmr_bukti FROM invoice_detail WHERE customer_id = 42) AND customer_id = 42 一起使用;谢谢大家
    • 为什么在子选择中使用 DISTINCT?如果 nmr_bukti 可以为空,NOT IN 也有点“危险”......)
    • 这取决于提问者使用的结构、规则和协议。
    • 这取决于提问者使用的结构、规则和协议。在这种情况下,DISTINCT 可能是多余的。在这种情况下使用它的效率可能略高或略低,但它将是一个更小、更整洁的数据集,我发现这通常有助于设计、编程和调试。从问题的上下文来看,我将假设 nmr_bukti 在 invoice_detail 中不为空。我不确定在它为空的情况下会发生什么,但在没有更具体的问题的情况下,我准备做出假设,并在出现任何后续问题时处理它们。
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多