【问题标题】:Mysql - Query to show a single record of two linked tables whose condition is only in one of themMysql - 查询以显示两个链接表的单个记录,其条件仅在其中一个表中
【发布时间】:2019-10-07 16:22:09
【问题描述】:

我有两个通过 id_factura 字段链接的表。

“factura”表为每笔销售生成一个 id,可以包含销售表的多个产品,并且还有一个名为 num_factura 的字段,其中包含发票编号。

“venta”表包含“nuevo”或“usado”状态的产品等。 在这两个表中已经进行了几个查询。这些表还有其他字段,例如注册日期...

表格事实

+---------------+-------------+
|   id_factura  | num_factura |   
+---------------+-------------+
|       1       |      1      |
|       2       |      2      |
|       3       |      1      |
|       4       |      2      |
|       5       |      3      |
+---------------+-------------+

塔布拉文塔

+---------------+-------------+-------------+
|   id_venta    |   estado    | id_factura  |
+---------------+-------------+-------------+
|       1       |    usado    |     1       |
|       2       |    usado    |     2       |
|       3       |    nuevo    |     1       |
|       4       |    nuevo    |     2       |
|       5       |    nuevo    |     3       |    
+---------------+-------------+-------------+

我要问的问题是,表示sale-purchase表的状态,返回最后一个发票号,然后我在新记录中加1。

但我遇到的问题是,在执行 where estado = 'usado' 时,它不会影响我,因为无论条件如何,我都会采用最大的发票编号。

SELECT num_factura
FROM factura f
LEFT JOIN venta v ON v.id_factura = f.id_factura
WHERE estado = 'usado'
GROUP BY num_factura
ORDER BY num_factura DESC LIMIT 1;

我得到以下结果

+---------------+-------------+
|  num_factura  |  id_factura |   
+---------------+-------------+
|       3       |      5      |
+---------------+-------------+

我想要这个结果,因为这个结果是 estado = 'usado' 的最后一个结果

+---------------+-------------+
|  num_factura  |  id_factura |
+---------------+-------------+
|       2       |      2      |
+---------------+-------------+

【问题讨论】:

  • GROUP BY没有聚合的目的是什么?了解如何正确使用GROUP BY

标签: mysql sql record


【解决方案1】:

您可以在 factura 和与 usado 相关的 max factura 的子查询之间使用连接

select  f.id_factura, t.num_facture
from  factura f
inner join  (
  SELECT MAX(f.num_factura)  num_factura
  FROM factura f
  JOIN venta v ON v.id_factura = f.id_factura 
    AND  v.estado = 'usado';
) t  on t.num_factura = f.num_factura

【讨论】:

    【解决方案2】:

    只需将您的LEFT JOIN 更改为INNER JOIN,因为左连接正在考虑factura 表中的所有行,而不管venta 表中的estado 是否为usado

    另外,您可以简单地使用MAX() 而不是任何GROUP BY 来获得最高的num_factura

    SELECT MAX(f.num_factura) AS num_factura
    FROM factura f
    JOIN venta v ON v.id_factura = f.id_factura  -- changed to INNER JOIN
    WHERE v.estado = 'usado';
    

    结果

    | num_factura |
    | ----------- |
    | 2           |
    

    View on DB Fiddle

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2023-03-11
      • 2014-09-17
      • 1970-01-01
      相关资源
      最近更新 更多