MySQL查询,两个表与订单组依据

时间:2017-04-26 11:41:57

标签: mysql

我有两张桌子,账单和行号。我需要客户购买的所有产品。我已经开始工作了:

SELECT referencia, codcliente, pvpunitario, t2.fecha FROM 
lineasfacturascli T1
INNER JOIN facturascli T2 ON T1.idfactura = T2.idfactura
WHERE T2.codcliente = "000001"
GROUP BY referencia

但我需要获得客户为每种产品支付的最后价格。我试图按"fecha"->(date)订购,但它不起作用。

表格结构

 facturascli 
   idfactura(id bill), 
   codcliente(client id), 
   fecha(date)

 lineasfacturascli 
   referencia(name of product), 
   idfactura(id bill) 
   pvpunitario(price)

修改

DRapp解决方案有效但我还需要处理客户在同一天购买它的情况只能获得更低的价格:

提供解决方案的结果是:

|Referencia| |MostRecentDatePerItem| |MostRecentPricePerItem|
| pendrive | |    2017-03-02       | |          50          |
| pendrive | |    2017-03-02       | |          10          |
| samsung  | |    2017-03-02       | |          50          |
| linux car| |    2017-04-26       | |         9.99         |

我需要:

|Referencia| |MostRecentDatePerItem| |MostRecentPricePerItem|
| pendrive | |    2017-03-02       | |          10          |
| samsung  | |    2017-03-02       | |          50          |
| linux car| |    2017-04-26       | |         9.99         |

由于

1 个答案:

答案 0 :(得分:0)

我会从对每个项目的最大日期作为分组的特定人员的所有订单项进行内部预查询。因此,如果一个人多次订购了10件事,那么说... 50个订单,你仍然会得到10件事的最终清单,但也是订购物品的最新日期。

以下内容不是完全了解您的结构,也不是样本数据(请提供将来的信息)。此外,您应始终使用相应的表别名引用限定查询中的表列,以便用户知道哪个字段来自哪个表。我必须假设" pvpunitario"列是来自订单项详细信息的价格,但基本翻译似乎是" unit"不是价格。如果我的印象不准确,您必须相应调整。

select
      T1.referencia,
      max( t2.fecha ) as MostRecentDatePerItem
   FROM
      lineasfacturascli T1
         INNER JOIN facturascli T2 
            ON T1.idfactura = T2.idfactura
   WHERE 
      T2.codcliente = "000001"
   GROUP BY 
      T1.referencia

因此,这将为我们提供单个客户订购的产品和最长日期。现在,我们将此结果作为原始查询的基础,重新连接到与相应的MostRecentDatePerItem特定匹配的订单项/订单标题。

select
      TT1.Referencia,
      PQ.MostRecentDatePerItem,
      TT1.pvpunitario as MostRecentPricePerItem
   from
      lineasfacturascli TT1
         JOIN
         (select
                T1.referencia,
                max( t2.fecha ) as MostRecentDatePerItem
             FROM
                lineasfacturascli T1
                   INNER JOIN facturascli T2 
                      ON T1.idfactura = T2.idfactura
             WHERE 
                T2.codcliente = "000001"
             GROUP BY 
                T1.referencia ) PQ
            on TT1.Referencia = PQ.Referencia
            JOIN facturascli TT2 
               ON TT1.idfactura = TT2.idfactura
              AND PQ.MostRecentDatePerItem = TT2.Fecha
   where
      TT2.codcliente = "000001"

澄清发生了什么。内部查询(现在是别名" PQ" - PreQuery),只是针对一个客户的合格项目,最近的日期表示该项目已被购买。

现在回到加入此表的所有订单行项目的原始列表,保持参考产品ID的链接。现在,我们再次转到订单表头并仍然应用相同的客户端代码,但是也加入了与事务的最大日期相同的FETCHA日期。因此,我们只想获取所述产品的详细级别价格/单位信息。

希望这有助于指导您的最终解决方案。如果我对任何部分不正确,您应编辑原始问题并提供其他缺失的详细信息/别名参考/样本数据。然后您可以回复评论以获得后续支持。

每条评论的答案。

要获得最低价格,您只需调整外部选择并添加组。由于该项目相同,因此group by将仅对该特定日期的价格进行分组。将上述内容更改为......

select
      TT1.Referencia,
      PQ.MostRecentDatePerItem,
      MIN( TT1.pvpunitario ) as LeastPricePerItemOnThisDate
   (same rest of query)
GROUP BY
      TT1.Referencia,
      PQ.MostRecentDatePerItem