首页 > 解决方案 > 条件语句 - MYSQL

问题描述

我需要用 3 个条件构建一个查询,但所有尝试过的表单都返回给我这三个表,即使它们有空值。

我尝试使用左连接和左外连接,但它没有用

如何只取回已输入数据的表?

SELECT * FROM tb_associado AS associado 
INNER JOIN tb_ProdutoComercial AS comercial ON associado.id_prodcomerc_a = comercial.id_prodcomerc
INNER JOIN tb_ProdAnsS4E AS sq ON comercial.id_ProdutoS4E_c = sq.nu_CodProdutoS4E
INNER JOIN tb_meiopagto AS tmp ON associado.id_meiopagto_a = tmp.id_meiopagto

LEFT JOIN tb_pgtoboleto AS tb ON (associado.id_associado = tb.cd_associado_pb AND tmp.cd_codmeiopagto = '3' AND tb.cd_associado_pb <> NULL) -- cond 1

LEFT JOIN tb_pgtocartao AS tc ON (associado.id_associado = tc.cd_associado_pc AND tmp.cd_codmeiopagto = '1' AND tc.cd_associado_pc <> NULL) -- cond 2

LEFT JOIN tb_pgtodebito AS td ON (associado.id_associado = td.cd_associado_pd AND tmp.cd_codmeiopagto = '2' AND td.cd_associado_pd <> NULL) -- cond 3

WHERE associado.id_associado = '311';


标签: mysqljoinconditional-statements

解决方案


我认为一点点错误是你理解NULL的方式。LEFT JOIN 一开始就已经提升了 NULL。LEFT JOIN 比 INNER JOIN 更松散。

为了获得所有记录的可能 NOT NULL。您必须在更大的查询中转移 NULL 条件。

SELECT * FROM tb_associado AS associado 
INNER JOIN tb_ProdutoComercial AS comercial ON associado.id_prodcomerc_a = comercial.id_prodcomerc
INNER JOIN tb_ProdAnsS4E AS sq ON comercial.id_ProdutoS4E_c = sq.nu_CodProdutoS4E
INNER JOIN tb_meiopagto AS tmp ON associado.id_meiopagto_a = tmp.id_meiopagto

LEFT JOIN tb_pgtoboleto AS tb 
   ON (associado.id_associado = tb.cd_associado_pb AND tmp.cd_codmeiopagto = '3' ) -- cond 1

LEFT JOIN tb_pgtocartao AS tc
    ON (associado.id_associado = tc.cd_associado_pc AND tmp.cd_codmeiopagto = '1') -- cond 2

LEFT JOIN tb_pgtodebito AS td 
   ON (associado.id_associado = td.cd_associado_pd AND tmp.cd_codmeiopagto = '2') -- cond 3

WHERE associado.id_associado = '311'
AND  tb.cd_associado_pb <> NULL   -- condition 1
 AND tc.cd_associado_pc <> NULL -- condition 2
 AND td.cd_associado_pd <> NULL  -- condition 3
;

一系列的 AND 条件有点严格。您可以应用 OR 和一组 for () 括号来更改逻辑。


推荐阅读