mysql - 使用多个选择连接表
问题描述
基本上,据我了解,我需要在另一个查询中使用多项选择构造一个查询。这是包含所有产品的主表: proddb,
onrrnr 列值在这里是唯一的
+----------+-------+------+-----------------------+-----+-------+-------+
| onrrnr | onr | idnr | prod | qty | measx | measy |
+----------+-------+------+-----------------------+-----+-------+-------+
| 30000001 | 30000 | 2868 | P444s-15Ar;15Ar | 15 | 608 | 808 |
| 30000002 | 30000 | 2869 | P4kar44skar-15Ar;15Ar | 10 | 679 | 1905 |
| 30000003 | 30000 | 2870 | P4kar44skar-15Ar;15Ar | 15 | 679 | 1905 |
+----------+-------+------+-----------------------+-----+-------+-------+
这是打包产品表: packlist,列中没有唯一值
+----------+---------+------------+-----------------------+
| onrrnr | rackid | packed_qty | timestamp |
+----------+---------+------------+-----------------------+
| 30000001 | A664 | 15 | "2018-05-23 21:35:16" |
| 30000002 | A664 | 4 | "2018-05-23 21:35:24" |
| 30000003 | A140510 | 14 | "2018-05-24 13:56:58" |
| 30000002 | A140510 | 6 | "2018-05-23 21:35:34" |
| 30000003 | A161209 | 1 | "2018-05-24 13:57:14" |
+----------+---------+------------+-----------------------+
两个表之间的关系是“onrrnr”列。前端用户选择一个日期并获取当天所有打包的产品,还必须显示有多少产品在截止日期前解包(通过在选定日期之前将所有打包的相同 onrrnr 相加得到)。
我需要一个查询来获得结果,因为我使用 fppdf 来生成基于 mysql 查询的表。选择日期 2018-05-24 时的结果必须是这样的:packed 包含该日期的总打包数量,括号中包含多少已解包(从 proddb-total 打包到期日期订购的总数)
+------+-----------------------+--------+
| idnr | product | packed |
+------+-----------------------+--------+
| 2868 | P444s-15Ar;15Ar | 0(0) |
| 2869 | P4kar44skar-15Ar;15Ar | 0(0) |
| 2870 | P4kar44skar-15Ar;15Ar | 15(0) |
+------+-----------------------+--------+
and when select date 2018-05-23:
+------+-----------------------+--------+
| idnr | product | packed |
+------+-----------------------+--------+
| 2868 | P444s-15Ar;15Ar | 15(0) |
| 2869 | P4kar44skar-15Ar;15Ar | 10(0) |
| 2870 | P4kar44skar-15Ar;15Ar | 0(15) |
+------+-----------------------+--------+
注意最后一排,由于2018-05-23没有包装任何id2870产品,表明15个没有包装。
是否甚至可以仅使用单个查询来获得此结果?我面临的第一个问题是我无法通过正确的包装数量获得不同的 idnr。其次,我不知道如何获得所选日期的包装数量总和。到目前为止我的查询:
SELECT
proddb.idnr,
CONCAT(sum(packlist.packed_qty),"\n(",proddb.qty-packlist.packed_qty,")") AS packed,
prod as product
FROM proddb
JOIN packlist ON packlist.onrrnr=proddb.onrrnr
WHERE proddb.onr="'.$_POST['ordNr'].'"
AND date(packlist.timestamp)="'.$_POST['date'].'"
GROUP BY
proddb.idnr
解决方案
有一些你可以尝试做。
- 使用
Outer join
基于proddb
- 将
date
条件ON
从 Where 子句设置为子句,否则您将错过一些数据onrrnr
, CASE WHEN
在SUM
计算总金额的功能中。
这是来自的示例查询
SELECT idnr,
prod,
CONCAT(cnt,"\n(", qty - cnt,")") packed
FROM
(
SELECT
p.idnr,
p.prod,
SUM(CASE WHEN pl.packed_qty IS NOT NULL THEN pl.packed_qty ELSE 0 END) cnt,
p.qty
FROM proddb p
LEFT JOIN packlist pl ON pl.onrrnr=p.onrrnr and date(pl.timestamp) = '2018-05-23'
GROUP BY
p.onrrnr,
p.prod,
p.qty
) t
在您的问题中,您可以尝试使用
SELECT idnr,
prod,
CONCAT(cnt,"\n(", qty - cnt,")") packed
FROM
(
SELECT
p.idnr
p.prod,
SUM(CASE WHEN pl.packed_qty IS NOT NULL THEN pl.packed_qty ELSE 0 END) cnt,
p.qty
FROM proddb p
LEFT JOIN packlist pl ON pl.onrrnr=p.onrrnr and date(packlist.timestamp)="'.$_POST['date'].'"
WHERE proddb.onr="'.$_POST['ordNr'].'"
GROUP BY
p.onrrnr,
p.prod,
p.qty
) t
[结果] 2018-05-23
| idnr | prod | packed |
|------|-----------------------|--------|
| 2868 | P444s-15Ar;15Ar | 15(0) |
| 2869 | P4kar44skar-15Ar;15Ar | 10(0) |
| 2870 | P4kar44skar-15Ar;15Ar | 0(15) |
[结果] 2018-05-24
| idnr | prod | packed |
|------|-----------------------|--------|
| 2868 | P444s-15Ar;15Ar | 0(15) |
| 2869 | P4kar44skar-15Ar;15Ar | 0(10) |
| 2870 | P4kar44skar-15Ar;15Ar | 15(0) |
推荐阅读
- swift - 具有缩放和 alpha 的 UIView 动画
- c# - 如何设置一个在 C# 中使用字符串?
- java - 如何使用我自己的属性、规范和可分页创建自定义 Spring Data JPA 查找方法?
- sql-server - SQL Server 全文搜索在时间窗口内的最大性能限制
- c# - AspNet 用户声明丢失
- google-apps-script - getActiveCell() 总是返回 1,1
- ansible - Ansible 测试变量以什么开头
- android - 在 Android 中将字符串作为文件附件共享
- swift - 如何告诉用户准确的度数是朝北还是朝东?
- scala - Cats - EitherT - 发散隐式扩展以进行理解而无需显式输入?