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_factura
和 id_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 | |
可能我解释的有点绕,我解释一下:
我有一个带有 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_factura
和 id_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 | |