Mysql - запрос, чтобы показать одну запись двух связанных таблиц, состояние которых только в одной из них - PullRequest
1 голос
/ 07 октября 2019

У меня есть две таблицы, связанные полем id_factura.

Таблица 'factura' генерирует идентификатор для каждой сделанной продажи, может содержать несколько продуктов таблицы продажи, а также имеет поле с именем num_facturaс номером счета-фактуры.

В таблице «venta» есть продукты со статусом «nuevo» или «usado». В этих двух таблицах уже сделано несколько запросов. В этих таблицах есть и другие поля, такие как дата регистрации ...

Таблица фактур

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

Tabla venta

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

Вопрос, который я хочу задать, заключается в том, чтос указанием статуса таблицы купли-продажи, верните последний номер счета-фактуры, а затем я добавляю 1. к новой записи.

Но проблема, с которой я сталкиваюсь, заключается в том, что при выполнении инструкции 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      |
+---------------+-------------+

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Вы можете использовать соединение между фактурой и подзапросом для максимальной фактуры, связанной с usado

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
0 голосов
/ 07 октября 2019

Просто измените LEFT JOIN на INNER JOIN, потому что при левом соединении учитываются все строки таблицы factura, независимо от того, * estado в таблице venta - 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           |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...