如何使用 IF() 条件在 MySQL 中同时显示真行和假行

How to display both true and false rows in MySQL with IF() condition

订单Table

+---------+------------+----------------+----------+------------+
| OrderID | CustomerID | DateOfPurchase | Discount | DueDate    |
+---------+------------+----------------+----------+------------+
|      82 |          7 | 2022-04-17     | 0        | 2022-05-17 |
|      83 |         91 | 2022-04-17     | 0        | 2022-05-17 |
|      84 |          8 | 2022-04-17     | 0        | 2022-05-17 |
|      85 |         91 | 2022-04-17     | 0        | 2022-05-17 |
|      86 |          7 | 2022-04-17     | 0        | 2022-05-17 |
|      87 |         91 | 2022-04-18     | 0        | 2022-05-18 |
|     109 |          7 | 2022-04-25     | 0        | 2022-05-25 |
+---------+------------+----------------+----------+------------+

客户table

+------------+----------+-------+-------+-------------+-----------------------------+----------+--------------+
| CustomerID | Fname    | Mname | Lname | Contact_no  | Address                     | Valid_id | Credit_Limit |
+------------+----------+-------+-------+-------------+-----------------------------+----------+--------------+
|          7 | John     | Dale  | Doe   | 09123654789 | Asan Sur, Sison, Pangasinan | NULL     |     5000.000 |
|          8 | Jane     | Dale  | Doe   | 09987654123 | Asan Sur, Sison, Pangasinan | NULL     |     1500.000 |
|         91 | Kurdapya | Buang | Selos | 09741258963 | Paldit, Sison, Pangasinan   | NULL     |     5000.000 |
+------------+----------+-------+-------+-------------+-----------------------------+----------+--------------+

付款table

+-----------+------------+---------+------------+----------+
| PaymentID | CustomerID | OrderID | PayDate    | Amount   |
+-----------+------------+---------+------------+----------+
|        20 |          7 |      82 | 2022-04-25 |  800.000 |
|        21 |         91 |      83 | 2022-04-17 | 2500.000 |
|        22 |         91 |      85 | 2022-04-17 |  200.000 |
|        23 |         95 |      88 | 2022-04-18 | 2122.000 |
|        24 |         96 |      90 | 2022-04-25 |  577.000 |
|        25 |         97 |     111 | 2022-04-25 |    0.000 |
|        26 |         98 |     114 | 2022-04-25 |  166.000 |
|        27 |         99 |     115 | 2022-04-25 | 1740.000 |
+-----------+------------+---------+------------+----------+

我想知道客户 Kurdapya (OrderID=91) 的 OrderID 是已付款的还是未付款的

这是我迄今为止尝试过的查询

尝试 1:

select if(py.OrderID=r.OrderID, 'paid','unpaid') as remarks, r.OrderID, r.CustomerID
from orders r,
     payment py
where py.OrderID = r.OrderID and r.CustomerID = 91
GROUP by r.OrderID;

尝试 1 的结果:

+---------+---------+------------+
| remarks | OrderID | CustomerID |
+---------+---------+------------+
| paid    |      83 |         91 |
| paid    |      85 |         91 |
+---------+---------+------------+

尝试 2:

select if(py.OrderID=r.OrderID and py.OrderID=py.Amount!='null', 'paid','unpaid') as remarks, r.OrderID, r.CustomerID
from orders r,
     payment py
where r.CustomerID = 91
GROUP by r.OrderID;

尝试 2 的结果:

+---------+---------+------------+
| remarks | OrderID | CustomerID |
+---------+---------+------------+
| unpaid  |      83 |         91 |
| unpaid  |      85 |         91 |
| unpaid  |      87 |         91 |
+---------+---------+------------+

我想要的结果是:

    +---------+---------+------------+
    | remarks | OrderID | CustomerID |
    +---------+---------+------------+
    | unpaid  |      83 |         91 |
    | unpaid  |      85 |         91 |
    | paid    |      87 |         91 |
    +---------+---------+------------+

你可以试试

select  CASE
    WHEN P.Amount > 0 then 'paid' else 'unpaid' end as remarks,
        O.orderID, O.CustomerID
from Customer C inner join OrderTable O on C.CustomerID  = O.CustomerID 
inner join Payment P on P.OrderID = O.OrderID
where O.CustomerID = 91
SELECT
  IF(py.OrderID IS NULL, 'unpaid', 'paid') AS remarks,
  r.OrderID,
  r.CustomerID
FROM orders AS r
LEFT OUTER JOIN payment AS py USING (OrderID)
WHERE r.CustomerID = 91

但是,由于订单table没有金额,我不知道支付的金额是否足以支付全部订单。

你的第二个查询甚至没有编译。 试试这个

select if(py.Amount is not null, 'paid','unpaid') as remarks, r.OrderID, r.CustomerID
from orders r
left outer join payment py on r.OrderID=py.OrderID
where r.CustomerID = 91;

注意事项:

  • 我使用了现代的显式 JOIN 语法 - 请参阅@jarlh
  • 的评论
  • 我已经使用了 LEFT OUTER join
  • 我已经删除了 'null' 中的引号 - NULL 是一个特定值,而 'null' 是一个字符串
  • 不需要GROUP BY