Mysql - 查询显示两个链接表的单个记录,其条件仅在其中一个中

Mysql - Query to show a single record of two linked tables whose condition is only in one of them

我有两个 table 由 id_factura 字段链接。

'factura' table 为每次销售生成一个 ID,可以包含销售的多个产品 table,还有一个名为 num_factura 的字段带有发票编号。

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

Table factura

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

我想问的是,表示买卖状态table,return最后的发票号码,然后我在新记录中加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      |
+---------------+-------------+

只需将 LEFT JOIN 更改为 INNER JOIN,因为左连接正在考虑 factura table 中的所有行,而不管 estadoventa table 中是否 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

您可以在 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