【问题标题】:Join on table with one-to-many relationship producing weird results以一对多关系加入表,产生奇怪的结果
【发布时间】:2019-05-06 22:19:23
【问题描述】:

我正在尝试为在特定日期范围内具有 onlineorderid 的所有订单提取付款信息​​,该信息位于不同的表格中。但是我得到了不一致的结果以及很多重复。

我尝试在 tblpayments 和 tblorders 之间执行简单的连接,但没有成功。我认为问题在于 tblpayments 与 tblorders 具有一对多的关系,因为同一个 orderid 上可以有多个付款。请记住,这是 MYSql 5.6

这是我尝试过但最终不起作用的查询。

SELECT 
    pmtorderid,
    pmtorderdate AS 'Date',
    pmtamt,
    pmtchgtip,
    pmtident1,
    o.ordonlineorderid
FROM
    tblorders o
        LEFT OUTER JOIN
    tblpayments p ON p.pmtorderid = o.orderid
WHERE
    pmttype = 3
        AND o.ordonlineorderid IS NOT NULL
        AND DATE(PmtOrderDate) BETWEEN '2019-04-22' AND '2019-04-30'
GROUP BY PmtOrderID , PmtOrderDate

当我使用下面的 WHERE 子句查询 tblorders 时,我得到了大约 70 多条记录,这是准确的,但是当我将此子句与 JOIN 一起使用时,我得到了数千条我知道不正确的记录。

WHERE pmttype = 3 
    AND o.ordonlineorderid IS NOT NULL 
    AND DATE(PmtOrderDate) BETWEEN '2019-04-22' AND '2019-04-30'

【问题讨论】:

  • GROUP BY 在您的查询中的用途是什么?
  • 在 where 子句中的 PmtOrderDate 不应该是 pmtorderdate 吗?大小写对于列名很重要。
  • 谷歌如何使用GROUP BY。它在这里毫无用处。
  • 我只是出于好奇才添加它,因为我的原始查询产生了数千条记录。使用 group by 将其减少到几百个,这仍然是错误的,但我保持原样,因为如果这是有道理的,它的错误会稍微少一些,而且我不确定当时还能尝试什么。对我来说可能是一个糟糕的决定,对此感到抱歉。

标签: mysql sql join subquery


【解决方案1】:

看起来你的左连接逻辑很混乱。使用左连接并为左表添加 where 条件将返回右表中的每一行,并且某些行将在左表中匹配。

根据您的 where 条件,我认为您只想要两个表中的行,在这种情况下,将您的联接更改为 INNER JOIN。

这里有一个链接,可以稍微了解一下左连接和内连接: http://a4academics.com/tutorials/24-sql-tutorial/729-difference-between-inner-join-and-left-join

【讨论】:

    【解决方案2】:

    正如您所说,一个订单可以有多次付款,也可能有多个订单一次付款。在这种情况下,可能需要通过其他表来连接其他一些字段。由于不了解您的架构,我们无法提供具体的解决方案。

    【讨论】:

    • 谢谢,我找到了另一个字段来加入表格,这似乎已经解决了这个问题!
    【解决方案3】:

    不要使用左外连接,而是使用连接。这将消除 tblorders 中没有匹配行的 tblpayments 行。此外,列名区分大小写,请确保其拼写(包括大小写)正确。

    SELECT 
        p.pmtorderid,
        p.pmtorderdate AS 'Date',
        p.pmtamt,
        p.pmtchgtip,
        p.pmtident1,
        o.ordonlineorderid
    FROM tblorders o
    JOIN tblpayments p 
        ON p.pmtorderid = o.orderid
    WHERE
        p.pmttype = 3
        AND o.ordonlineorderid IS NOT NULL
        AND DATE(p.pmtorderdate) BETWEEN '2019-04-22' AND '2019-04-30'
    GROUP BY pmtorderid, pmtorderdate
    

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多