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 中的所有行,而不管 estado
在 venta
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 |
您可以在 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
我有两个 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 中的所有行,而不管 estado
在 venta
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 |
您可以在 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