以一对多关系加入桌面产生奇怪的结果

时间:2019-05-06 22:19:24

标签: mysql sql join subquery

我正在尝试提取在特定日期范围内具有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'

3 个答案:

答案 0 :(得分:0)

看起来您的左联接逻辑感到困惑。使用左联接并添加左表的where条件将返回右表中的每一行,并且某些行在左表中具有匹配项。

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

这里是一个链接,可让您了解有关左对内联接的一些信息: http://a4academics.com/tutorials/24-sql-tutorial/729-difference-between-inner-join-and-left-join

答案 1 :(得分:0)

如您所述,一个订单可以有多个付款,多个订单可能有一个付款。在这种情况下,有可能需要通过其他表来加入其他字段。不了解您的架构,我们无法提供特定的解决方案。

答案 2 :(得分:0)

使用联接代替使用左外部联接。这将消除tblorders中没有匹配行的tblorders中的行。另外,列名区分大小写,请确保其拼写(包括大小写)正确。

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