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