首页 > 解决方案 > 使用多个选择连接表

问题描述

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

标签: mysqlsql

解决方案


有一些你可以尝试做。

  1. 使用Outer join基于proddb
  2. date条件ON从 Where 子句设置为子句,否则您将错过一些数据onrrnr
  3. CASE WHENSUM计算总金额的功能中。

这是来自的示例查询

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

推荐阅读