N到N的关系,搜索不相关的行

时间:2015-10-23 17:25:07

标签: mysql

我有两张桌子:Lancamento和Pagamento。这两个表有一个N到N的关系,因为我有第三个表:lancamentoHasPagamento。

我想查看表lancamento中与table pagamento行无关的所有行。

我这样做了:

SELECT * FROM lancamento l 
LEFT OUTER JOIN lancamento_has_pagamento hp ON l.codigo != hp.codigo_lancamento 
WHERE bol_quitado = 0 
AND YEAR(l.data_vencimento) = 2015
AND MONTH(l.data_vencimento) = 10
AND l.valor BETWEEN 475.00 AND 525.00;

然而,这段代码重复了对lancamento_has_pagamento表格中每一行的搜索,你们有没有解决这个问题的方法呢?

示例:

lancamento_has_pagamento

enter image description here
让我们说我在Lacamento表中有一行数据= 2015-10-15而且valor = 500.00并且行鳕鱼是128.我期待代码只返回一次128行。

2 个答案:

答案 0 :(得分:1)

你的连接条件应该是“=”而不是“!=”,然后你应该测试你的另一个表的外键是NULL:

SELECT * FROM lancamento l 
LEFT OUTER JOIN lancamento_has_pagamento hp ON l.codigo = hp.codigo_lancamento 
WHERE hp.codigo_lancamento IS NULL
//... your other conditions come here.
;

答案 1 :(得分:0)

如果我找对你,你需要这样的东西:

SELECT * FROM lancamento l 
LEFT JOIN lancamento_has_pagamento hp 
ON l.codigo = hp.codigo_lancamento
WHERE bol_quitado = 0 
AND YEAR(l.data_vencimento) = 2015
AND MONTH(l.data_vencimento) = 10
AND l.valor BETWEEN 475.00 AND 525.00
GROUP BY l.codigo # <-- this codigo column is your key column
HAVING COUNT(hp.codigo_lancamento)=0;

甚至更简单:

SELECT * FROM lancamento l 
LEFT JOIN lancamento_has_pagamento hp 
ON l.codigo = hp.codigo_lancamento
WHERE hp.codigo_lancamento IS NULL
AND bol_quitado = 0 
AND YEAR(l.data_vencimento) = 2015
AND MONTH(l.data_vencimento) = 10
AND l.valor BETWEEN 475.00 AND 525.00