根据我的理解,基本上,我需要使用多个选择在另一个查询中构造一个查询。 这是包含所有产品的主表: 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 |
+----------+-------+------+-----------------------+-----+-------+-------+
这是包装产品表: 包装清单, 列中没有唯一值
+----------+---------+------------+-----------------------+
| 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”列。 前端用户选择一个日期并获取当天的所有已包装产品,还必须显示有多少产品未包装的到期日期(通过将选定日期之前所有已包装的相同包装上的总和求出)。
我需要一个查询来获取结果,因为我使用fppdf来基于mysql查询生成表。 当选择日期2018-05-24时,结果必须是这样的:packed包含该日期的打包数据,并在括号中解压缩了多少(从proddb订购的总数量到总打包到期日期)
+------+-----------------------+--------+
| idnr | product | packed |
+------+-----------------------+--------+
| 2868 | P444s-15Ar;15Ar | 0(0) |
| 2869 | P4kar44skar-15Ar;15Ar | 0(0) |
| 2870 | P4kar44skar-15Ar;15Ar | 15(0) |
+------+-----------------------+--------+
以及选择日期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年5月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
答案 0 :(得分:0)
您可以尝试做一些。
Outer join
使用proddb
date
子句设置ON
条件,否则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) |