Mysql 将左连接限制为最多一个结果

Mysql 将左连接限制为最多一个结果,mysql,asp-classic,Mysql,Asp Classic,我试图计算两次之间我们收到的订单数量,以及仓库工作人员包装的订单数量 我们有一个包含订单的“订单”表,当订单完成时,不幸的是,当以不应添加到计算中的取消订单等方式处理订单时,它将收到一个“完成”状态,这是一个我无法更改的遗留代码 为了跟踪订单是否已打包,我想加入另一个名为“orders\u sent”的表,但不幸的是,如果订单有多个包,则该表中该orders\u id将有多行 所以我要做的是检查订单是否已经下了,如果它已经“完成”并且也存在于发送的表中,我将把它算作发送,如果它是“完成”但不在发

我试图计算两次之间我们收到的订单数量,以及仓库工作人员包装的订单数量

我们有一个包含订单的“订单”表,当订单完成时,不幸的是,当以不应添加到计算中的取消订单等方式处理订单时,它将收到一个“完成”状态,这是一个我无法更改的遗留代码

为了跟踪订单是否已打包,我想加入另一个名为“orders\u sent”的表,但不幸的是,如果订单有多个包,则该表中该orders\u id将有多行

所以我要做的是检查订单是否已经下了,如果它已经“完成”并且也存在于发送的表中,我将把它算作发送,如果它是“完成”但不在发送的表中,它应该被完全忽略,最后我要计算所有行的总数,忽略任何重复项,因为发送的表中有多个条目

以下是我到目前为止的想法

"SELECT " &_
"   COUNT(CASE orders_status WHEN 'Finished' THEN 1 ELSE NULL END) AS Sent, " &_
"   COUNT(*) AS Total " &_
"FROM " &_
"   orders " &_
"   LEFT JOIN orders_sent ON orders_id = orders_sent_orderid " &_
"WHERE " &_
"   orders_date > '" & datetime & "' " &_
"   AND orders_date < '" & dateAdd("d",1,datetime) & "' " &_
"   AND NOT (" &_
"       orders_status = 'FINISHED' " &_
"       AND orders_sent_id IS NULL) "
“选择”&_
发送时的计数(案例订单状态为“已完成”,然后为1,否则为空结束)&_
“将(*)计为总计”&_
“来自”&_
“订单”&_
“左连接订单\u按订单发送\u id=订单\u已发送\u订单id”&_
“哪里”&_
“订单日期>”&datetime&“&_
订单日期<'&dateAdd(“d”,1,datetime)和&_
“而不是(”&_
“订单\状态=‘已完成’”&_
“和订单\u发送\u id为空)”
我尝试根据orders\u sent\u id进行分组,但没有成功,因为sent表中不存在的所有订单都被分组在一起。尝试按订单分组给了我不确定的结果,我无法解释(发送6份,总计6份)。不分组给我发送了33个,总共54个

运行SQL,跳过计数,只显示订单ID,我使用下面的SQL在这段时间内总共得到47个订单。未分组显示一些重复ID,因为发送的订单包含多个订单的多行

"SELECT " &_
"   orders_id AS oid " &_
"FROM " &_
"   orders " &_
"   LEFT JOIN orders_sent ON orders_id = orders_sent_orderid " &_
"WHERE " &_
"   orders_date > '" & datetime & "' " &_
"   AND orders_date < '" & dateAdd("d",1,datetime) & "' " &_
"   AND NOT (" &_
"       orders_status = 'Skickad och avslutad' " &_
"       AND orders_sent_id IS NULL) " &_
"GROUP BY " &_
"   orders_id"
“选择”&_
“订单id为oid”&_
“来自”&_
“订单”&_
“左连接订单\u按订单发送\u id=订单\u已发送\u订单id”&_
“哪里”&_
“订单日期>”&datetime&“&_
订单日期<'&dateAdd(“d”,1,datetime)和&_
“而不是(”&_
“订单状态='Skickad och avslutad'”&_
“和订单\u发送\u id为空)”&_
“分组依据”&_
“订单号”

那么,如何才能从连接中消除重复项,使它们不会弄乱总数呢?

根据@p.Salmon的评论,这是一个已更正的SQL,它似乎解决了我的问题:

"SELECT " &_
"   COUNT(CASE WHEN orders_status = 'Finished' AND os.orders_sent_ts < '" & dateAdd("h",27,datetime) & "' THEN 1 ELSE NULL END) AS Sent, " &_
"   COUNT(*) AS Total " &_
"FROM " &_
"   orders " &_
"   LEFT JOIN (" &_
"       SELECT DISTINCT " &_
"           orders_sent_orderid, " &_
"           orders_sent_ts " &_
"       FROM " &_
"           orders_sent "&_
"       WHERE " &_
"           1) AS os ON orders_id = os.orders_sent_orderid " &_
"WHERE " &_
"   orders_date > '" & datetime & "' " &_
"   AND orders_date < '" & dateAdd("d",1,datetime) & "' " &_
"   AND NOT (" &_
"       orders_status = 'Finished' " &_
"       AND os.orders_sent_orderid IS NULL) "
“选择”&_
已发送的计数(订单状态为“已完成”且已发送的os.orders<'”和dateAdd(“h”,27,datetime)和“然后1个ELSE NULL END时的情况)&_
“将(*)计为总计”&_
“来自”&_
“订单”&_
“左连接(”&_
“选择不同的”&_
“订单\u已发送\u订单ID,”&_
“已发送的订单”&_
“来自”&_
“已发送订单”&_
“哪里”&_
“1)作为订单上的操作系统\u id=os.orders\u sent\u orderid”&_
“哪里”&_
“订单日期>”&datetime&“&_
订单日期<'&dateAdd(“d”,1,datetime)和&_
“而不是(”&_
“订单\状态=‘已完成’”&_
“和os.orders\u sent\u orderid为空)”

我在orders_sent表中为sent添加了一个时间戳,以确保我可以返回到任何日期,并查看当天的工作情况。+27小时是因为卡车在15:00离开,但是应该在当天发送的订单的截止时间是12:00。

“如何从连接中消除重复项,使它们不会弄乱总数”-在选择不同订单的子查询上,将左连接更改为左连接。\u sent\u id'“finished”但不在sent表中,它应该被完全忽略,“-真的-这是否意味着它不应该算作已放置?这是正确的。例如,已取消或更改的订单将标记为已完成。例如,修改后的订单将获得新的订单id。这是一个糟糕的系统。:)为了澄清一下,我只想计算应该已经发出的订单。此目的是计算放置后24小时内我们能够发送的数量。我还有一些其他的不合格因素,比如不计算缺货订单,这在这个例子中是不需要的。你的第一句话也解决了我的问题。所以我把它贴出来作为一个答案。非常感谢。