计算 Mysql 中外部 table 的结果总是 return 0 值

COUNT the result from external table in Mysql always return 0 value

我尝试用 2 个不同的 table 来计算行数。场景是如果状态 tbl_task 正在等待 ,则此作业尚未从 tbl_sales 获得 sales_id。一旦进程中的作业 ID,系统将自动在 tbl_sales 中创建记录并更新 tbl_task 为 sales_id

tbl_tasks

    +----+---------+----------+
    | id | status  | sales_id |
    +----+---------+----------+
    | 1  | Waiting | NULL     |
    +----+---------+----------+
    | 2  | Done    | 19       |
    +----+---------+----------+
    | 3  | Process | 20       |
    +----+---------+----------+
    | 4  | Waiting | NULL     |
    +----+---------+----------+
    | 5  | Cancel  | NULL     |
    +----+---------+----------+




tbl_sales

    +----------+-----+
    | sales_id | qty |
    +----------+-----+
    | 18       | 20  |
    +----------+-----+
    | 19       | 18  |
    +----------+-----+
    | 20       | 2   |
    +----------+-----+
    | 21       | 7   |
    +----------+-----+
    | 22       | 9   |
    +----------+-----+

此查询:

SELECT count(a.sales_id) total_sales, SUM(CASE WHEN b.status = 'Waiting' THEN 1 ELSE 0 END) AS total_waiting FROM tbl_sales a
LEFT JOIN tbl_tasks b ON a.sales_id = b.sales_id

return 等待为 0 如下:

+-------------+---------------+
| total_sales | total_waiting |
+-------------+---------------+
| 5           | 0             |
+-------------+---------------+

我的预期结果是:

+-------------+---------------+
| total_sales | total_waiting |
+-------------+---------------+
| 5           | 3             |
+-------------+---------------+

任何帮助将不胜感激,我也使用子查询进行了 LEFT JOIN,但得到的错误结果是 total_sales (10)

的两倍

您只检索未等待的销售 ID 19/20。

您需要在此处进行 RIGHT JOIN 才能从任务中获取所有元素。

这里的问题是您无法连接表,因为 sales_id 不相关。因此你可以使用 (https://www.db-fiddle.com/f/mf59EiGksZEWQMbpfBwQji/0) :

SELECT (SELECT count(*) FROM tbl_sales) total_sales, COUNT(*) total_waiting FROM tbl_tasks WHERE `status`="Waiting";

但是,如果您的 ID 是相关的 (https://www.db-fiddle.com/f/2AN55gQFfE69zPoEXDnWSX/0),您可以加入您的数据库:

SELECT * FROM tbl_tasks a
INNER JOIN tbl_sales b ON b.sales_id=a.sales_id;
SELECT COUNT(*) total_sales, COUNT(IF(a.`status` = 'Waiting',1,NULL)) total_waiting FROM tbl_tasks a
INNER JOIN tbl_sales b ON b.sales_id=a.sales_id;