2017-04-26 85 views
0

我有两个表,票据和行李。我需要一个客户曾经购买过的所有产品。我已经得到这个工作: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   | 

感谢

+0

that qeury does not work ok ... https://www.psce.com/blog/2012/05/15/mysql-mistakes-do-you-use- group-by-incorrect/ –

+0

请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-bea-a-非常简单的sql查询 – Strawberry

回答

0

我将开始与所有线项目是为某个人,每一个项目最多的日期作为一组由内预先查询。因此,如果一个人多次命令10件事情,比如说50个订单,那么你仍然有最终的10件事情清单,而且还有订购事件的最近日期。

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

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日期。因此,只有那么我们才想要获取所述产品的详细级别价格/单位信息。

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

每个评论的回答。

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

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

是的,这个工程!但是如果我能在同一天购买一篇文章,我该如何控制它?例如:querry的结果:| pendrive - > 2017-03-02 - > 10 $ |和| pendrive - > 2017-03-02 - > 12 $ |我只希望看到最低价格,因为如果客户在同一天内购买了2件商品... – aiocver

+0

@aiocver,对不起延迟。修改每个评论的答案。 – DRapp

+0

谢谢,工作正常! – aiocver