Mysql LEFT JOIN-使用付款金额方法的LEFT JOIN返回空结果

Mysql LEFT JOIN-使用付款金额方法的LEFT JOIN返回空结果,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,这是我关于stackoverflow的第一个问题,所以我尽量不要搞砸。我对这个问题纠结了几个小时,没有任何进展 我使用的视图中有多个预订。所有这些预订都有付款方式,如贝宝或信用卡 Customer Name | Price | payment_method John Doe | 20 | creditcard Susan Soe | 10 | paypal 通过我的sql查询,我试图获得所有付款方法的总和。不幸的是,本月未使用的付款方式没有出现 所以我用列方法

这是我关于stackoverflow的第一个问题,所以我尽量不要搞砸。我对这个问题纠结了几个小时,没有任何进展

我使用的视图中有多个预订。所有这些预订都有付款方式,如贝宝或信用卡

Customer Name | Price | payment_method
John Doe      |  20   |  creditcard
Susan Soe     |  10   |  paypal
通过我的sql查询,我试图获得所有付款方法的总和。不幸的是,本月未使用的付款方式没有出现

所以我用列方法创建了另一个名为PaymentMethods的表

Methods
creditcard
premium
sofort
bank
paypal
然后我尝试使用
左连接
得到如下结果:

payment_method  | TotalQuantity (->sum(price))
creditcard      | 20
premium         | 0
sofort          | 0
bank            | 0
paypal          | 10
但相反,我只收到了那个月已经使用了付款方法的款项

payment_method  | TotalQuantity (-> sum(price))
creditcard      | 20
paypal          | 10
这是我的声明。我真的很想知道我做错了什么

SELECT payment_method, SUM(IFNULL(price,0)) AS TotalQuantity 
FROM PaymentMethods 
LEFT JOIN PaymentMethods
ON SlotBookingsFullView.payment_method=PaymentMethods.Methods
WHERE (booking_date BETWEEN '2018-07-01 00:00:00' AND '2018-07-30 23:59:59') 
*编辑* m0lochwalker指出,我应该使用
GROUPBY
子句…我有它,但它是在复制和粘贴操作期间得到的。给你

GROUP BY PaymentMethods.Methods ORDER BY PaymentMethods.Methods DESC

您的结果就是左联接的结果。您应按付款方式对总数量和分组进行合计。你看过分组条款了吗?比如:

SELECT payment_method, sum(totalquantity) as qty
FROM myTable 
GROUP BY payment_method

外部联接记录时,其值为空:

PaymentMethods.Methods | B.payment_method | B.booking_date | B.Quantity ------------------------+-------------------+------------------+----------- creditcard | creditcard | 2018-07-01 | 2 creditcard | creditcard | 2018-07-05 | 1 creditcard | creditcard | 2018-04-21 | 4 premium | NULL | NULL | NULL ... 您将取消所有外部连接行,因为它们的
booking\u date
不在所需的日期范围内,但显然为空。这使得您的连接仅仅是内部连接。将外部联接的条件放在其on子句中:

SELECT pm.Methods, COALESCE(SUM(b.Price), 0) AS TotalQuantity 
FROM PaymentMethods pm
LEFT JOIN SlotBookingsFullView b
  ON  b.payment_method = pm.Methods
  AND b.booking_date >= date '2018-07-01'
  AND b.booking_date <  date '2018-07-31' 
GROUP BY pm.Methods
ORDER BY pm.Methods DESC;
选择pm.Methods,合并(总和(b.Price),0)作为TotalQuantity
来自PaymentMethods pm
左连接槽bookingsfullview b
关于b.付款方法=pm.方法
b.预订日期>=日期“2018-07-01”
和b.预订日期<日期'2018-07-31'
分组方法:pm
由pm订购。方法说明;

(如您所见,
COALESCE
IFNULL
属于
SUM
的外部,而不是内部,因为如果SUM为null,您希望将其替换为零。)

您的结果就是左连接的结果。您应按付款方式对总数量和分组进行合计。你看过分组条款了吗?类似于:您的查询中还有一个输入错误:
FROM PaymentMethods LEFT JOIN PaymentMethods
必须是
FROM PaymentMethods LEFT JOIN slotbooking
当然可以。谢谢您的回复。你是对的。需要分组,我已经有了,但在复制时丢失了。请参见编辑。我在你的答复中不明白的是总和(totalqanty)应该如何工作。totalquantity不是一列,而是一个“变量”。我当时在手机上,阅读速度很快。我想我可以建议小组讨论。很高兴你能让它工作。顺便说一句,你可以按“变量”分组,而不用使用CTE创建另一个表。看看他们。你的解决方案非常有效!也谢谢你的解释Thorsten!
SELECT pm.Methods, COALESCE(SUM(b.Price), 0) AS TotalQuantity 
FROM PaymentMethods pm
LEFT JOIN SlotBookingsFullView b
  ON  b.payment_method = pm.Methods
  AND b.booking_date >= date '2018-07-01'
  AND b.booking_date <  date '2018-07-31' 
GROUP BY pm.Methods
ORDER BY pm.Methods DESC;