Mysql - Получить все записи, в которых есть равные значения в одном поле и, в свою очередь, иметь ненулевое значение в других полях - PullRequest
0 голосов
/ 01 апреля 2020

Может быть, то, что я пытаюсь объяснить, немного запутанно, я объясняю:

У меня есть таблица с полем imei, id_factura, id_albaran, transaccion, estado (среди прочих).

imei может иметь transacion (compra или venta) и estado (nuevo или usado).

В моем запросе я хочу только для 'nuevo', в таблице есть сотни записей с imei, но могут быть только те же imei, estado = 'nuevo', transaccion = 'venta' с id_factura не нулевым или / и id_albaran не нулевым.

Цель этого запроса - найти out, если тот же imei, transacion = venta, estado = nuevo, имеет запись id_factura, не равную NULL, и другую запись id_albaran, не равную NULL, поэтому я хочу, чтобы он возвращал поле, если в нем есть две записи со значением 1 или если он имеет только одна запись, которая возвращает 0.

Я приведу пример того, что я хочу, чтобы запрос возвращал, в моем случае я хочу только то, что отмечено красным (продажа).

enter image description here

Я пробовал это (но неправильно):

SELECT imei
FROM ventacompra
WHERE transacion = 'venta' AND estado='nuevo' AND id_albaran IS NOT NULL
AND imei IN (SELECT imei FROM ventacompra v WHERE transacion = 'venta' AND estado='nuevo' AND id_factura IS NOT NULL)

____ РЕДАКТИРОВАТЬ НА ПРИМЕРЕ ____

transacion     estado   imei   id_factura   id_albaran  has_factu_alba
venta          nuevo    0001        01         NULL       1
venta          nuevo    0001      NULL         01         1
compra         nuevo    0002       01          NULL       0

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

С EXISTS:

SELECT v.* FROM ventacompra v
WHERE v.transacion = 'venta' AND v.estado='nuevo' AND (v.id_factura IS NULL XOR v.id_albaran IS NULL)
AND EXISTS (
  SELECT 1 FROM ventacompra
  WHERE  imei = v.imei AND transacion = v.transacion AND estado = v.estado
    AND (id_factura IS NULL) = (v.id_factura IS NOT NULL)
    AND (id_albaran IS NULL) = (v.id_albaran IS NOT NULL)
)

Если один из столбцов id_factura и id_albaran всегда null, а другой not null, то вы можете опустить условие:

AND (v.id_factura IS NULL XOR v.id_albaran IS NULL)

См. Демоверсию . Результаты:

| id_ventacompra | transacion | estado | imei            | id_factura | id_albaran |
| -------------- | ---------- | ------ | --------------- | ---------- | ---------- |
| 492            | venta      | nuevo  | 352984109069491 |            | 23         |
| 493            | venta      | nuevo  | 352984109069491 | 10         |            |
0 голосов
/ 01 апреля 2020

Я думаю, что вы можете сделать это, присоединившись к ventacompra и сопоставив записи с тем же imei, а затем отфильтровав только совпадающие записи в предложении WHERE. Поскольку вы делаете самостоятельное объединение, вы также хотите GROUP BY imei и, наконец, выбрать только DISTINCT результаты:

SELECT
    DISTINCT( v1.imei )
FROM
    ventacompra AS v1
LEFT JOIN
    ventacompra AS v2 ON (
        v1.id_ventacompra != v2.id_ventacompra /* avoid joining to self */
            AND
        v1.imei = v2.imei /* match imei */
            AND
        v1.estado = v2.estado AND v1.transaccion = v2.transaccion
    )
WHERE
    v1.transacion = 'venta'
        AND
    v1.estado='nuevo'
        AND
    (
        v1.id_factura IS NOT NULL
            OR
        v2.id_factura IS NOT NULL
    )
        AND
    (
        v1.id_albaran IS NOT NULL
            OR
        v2.id_albaran IS NOT NULL
    )
GROUP BY
    v1.imei
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...