Mysql - 获取在一个字段中存在相等值且在其他字段中具有非空值的所有记录

Mysql - Get all records where there is an equal value in one field and in turn have a non null value in other fields

可能我解释的有点绕,我解释一下:

我有一个带有 imei 字段的 table,id_factura,id_albaran,transaccion,estado(等等)。

IMEI 可以有 transacion(compra 或 venta)和 estado(nuevo 或 usado)。

在我的查询中,我只想要 'nuevo' 个,在 table 中有数百条带有 imei 的记录,但只能有相同的 imei,estado='nuevo' , transaccion='venta' with id_factura not null or/and id_albaran not null.

这个查询的objective是查询同一个imei,transacion=venta,estado=nuevo,有一个id_factura记录不为空,另一个id_albaran记录不为空null,所以我希望它成为 return 一个字段,如果它有两个值为 1 的记录,或者如果它只有一个记录 return 0.

我给你一个我想要查询的例子return,在我的例子中我只想要标有红色(促销)的东西。

我已经试过了(但是错了):

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)

____EDIT 对于 EXAMPLE____

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

我认为您可以通过加入 ventacompra 并匹配具有相同 imei 的记录,然后仅过滤 WHERE 子句中的匹配记录来做到这一点。由于您正在进行自连接,因此您还希望 GROUP BY imei 最后 select 只有 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

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_facturaid_albaran 列之一总是 null 而另一个 not null 那么你可以省略条件:

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

参见demo
结果:

| id_ventacompra | transacion | estado | imei            | id_factura | id_albaran |
| -------------- | ---------- | ------ | --------------- | ---------- | ---------- |
| 492            | venta      | nuevo  | 352984109069491 |            | 23         |
| 493            | venta      | nuevo  | 352984109069491 | 10         |            |