mysql - 添加一个新字段,通过表mysql的结果减去子查询的数量
问题描述
我希望能够在子查询中创建一个新列,该列从给定 id 中减去一个来自另一个表的查询的金额,该表可以返回几条记录。
这是子查询:
+---------------------------------------+------------+----------+
| name | id_product | quantity |
+---------------------------------------+------------+----------+
| Samsung Galaxy J3 2017 | 12 | 0 |
| Samsung Galaxy S8 | 15 | 2 |
| Samsung Galaxy S7 | 17 | 0 |
| Samsung Galaxy S7 Edge | 18 | 5 |
| Samsung Galaxy J1 mini Prime Dual SIM | 20 | 1 |
+---------------------------------------+------------+----------+
SELECT pl.name, pl.id_product, psa.quantity as stock
FROM `ps_product_lang` pl
LEFT JOIN `ps_product` p ON pl.id_product = p.id_product
LEFT JOIN `ps_category_product` pc ON p.id_product = pc.id_product
LEFT JOIN `ps_stock_available` psa ON p.id_product = psa.id_product
WHERE pc.id_category = 13 AND p.id_category_default = 17 AND p.condition = 'new'
GROUP BY p.id_product
另一个查询可以显示一个或多个记录:
其他表
+------------+-------+
| id_product | total |
+------------+-------+
| 15 | 1 |
| 18 | 2 |
+------------+-------+
SELECT id_product, count(id_product) as total
FROM ventacompra_tmp
GROUP BY id_product;
我想要的结果是这样的,只减去结果来自另一个表的字段,其他字段保持不变,框架中的“”字段发生变化。
+---------------------------------------+------------+----------+-------+
| name | id_product | quantity | stock |
+---------------------------------------+------------+----------+-------+
| Samsung Galaxy J3 2017 | 12 | 0 | 0 |
| Samsung Galaxy S8 | 15 | 2 | "1" |
| Samsung Galaxy S7 | 17 | 0 | 0 |
| Samsung Galaxy S7 Edge | 18 | 5 | "3" |
| Samsung Galaxy J1 mini Prime Dual SIM | 20 | 1 | 1 |
+---------------------------------------+------------+----------+-------+
解决方案
如果我理解正确,只需LEFT JOIN
在两个不同的结果集(派生表)上使用id_product
.
现在减去stock
左表中的值是否不是 NULL。使用以下内容:
SELECT t1.name,
t1.id_product,
t1.stock AS quantity,
(t1.stock - IFNULL(t2.total, 0)) AS stock
FROM
( SELECT pl.name, pl.id_product, psa.quantity as stock
FROM `ps_product_lang` pl
LEFT JOIN `ps_product` p ON pl.id_product = p.id_product
LEFT JOIN `ps_category_product` pc ON p.id_product = pc.id_product
LEFT JOIN `ps_stock_available` psa ON p.id_product = psa.id_product
WHERE pc.id_category = 13 AND p.id_category_default = 17 AND p.condition = 'new'
GROUP BY p.id_product ) AS t1
LEFT JOIN
( SELECT id_product, count(id_product) as total
FROM ventacompra_tmp
GROUP BY id_product ) AS t2 ON t2.id_product = t1.id_product
推荐阅读
- python - 与其他组件内联的破折号下拉列表的位置
- python - Urlopen 适用于某些 url,但对于其他会抛出 urllib.error.URLError:
- ssl - Apache VFS - FTPS support for TLSv1
- python - 获取特定范围内的值的每日百分比
- python - 如何使用用户输入引用对象?
- javascript - 使用 JavaScript 以编程方式访问和复制 PDF 字段属性 Adobe Acrobat Pro
- maven - Maven:在多项目开发中确保相同的主要父 pom 版本
- php - 关于语句的 PHP 错误,验证了查询和变量
- mysql - Mac 上的 OpenSSL / LibreSSL 问题 - dyld:未加载库:/usr/local/opt/openssl/lib/libssl.1.0.0.dylib
- vue.js - VueJS / Bootstrap vue - 部署时手风琴损坏