用多个选择联接表

时间:2018-07-30 06:27:05

标签: mysql sql

根据我的理解,基本上,我需要使用多个选择在另一个查询中构造一个查询。 这是包含所有产品的主表: 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

1 个答案:

答案 0 :(得分:0)

您可以尝试做一些。

  1. 基于Outer join使用proddb
  2. 从Where子句中为date子句设置ON条件,否则onrrnr会丢失一些数据,
  3. CASE WHEN中的
  4. 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

sqlfiddle

在您的问题中,您可以尝试使用

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) |