计算 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;
我尝试用 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;