Estou buscando dados de duas tabelas, membros e taxas. Gostaria de selecionar apenas os membros que não fizeram nenhum depósito este mês. Isto é o que eu tentei, mas os resultados não são o que eu pretendo obter. Qualquer ajuda será apreciada . Estou usando mysql.
SELECT
members.memberid,
members.companyid,
members.name,
members.initials,
members.surname,
members.datejoined,
members.usercode,
members.address,
members.cell,
members.pic,
members.idnumber, members.rank,
members.address2,
fees.feestype,fees.amountpaid,
fees.companyid,fees.paiddate,
fees.usercode
FROM
members
INNER JOIN fees
ON members.memberid = fees.memberid
WHERE
MONTH(fees.paiddate) < MONTH(CURDATE())
AND YEAR(fees.paiddate) < YEAR(CURDATE())
Você precisa fazer isso de uma maneira diferente: escolha todos os membros que não são
IN
o conjunto de membros que pagaram algo este mês :dbfiddle aqui
Você realmente consulta membros especificados que pagaram algo nos anos anteriores ao atual e no mês anterior ao atual.
Como segunda alternativa, você pode usar
NOT EXISTS
:dbfiddle aqui
E ainda outra alternativa (não tão clara, na minha opinião), faça a
LEFT JOIN
e defina umaWHERE
condição que filtrará as linhas realmente recuperando algo do lado direito do JOIN (ou seja: usando apenas as linhasWHERE
todas as colunas, e especificamentememberid
são NULL do lado direito):Verifique as melhores práticas entre usar LEFT JOIN ou NOT EXISTS
E verifique todos os dbfiddle aqui
Isso é chamado, em álgebra relacional, uma antijunção
ATUALIZAR
Dando um passo além da solução do Kondybas , e como apontado nos comentários à resposta do Kondibas por ypercube , isso pode ser simplificado ainda mais para:
Escrevendo a condição assim (ou seja: não ter uma função aplicada a paiddate), ele usará um índice como:
... como pode ser visto no plano de execução:
dbfiddle aqui
A terceira alternativa para as soluções do joanolo é buscar registros com NULLs
LEFT JOIN
de tabelas:Como sugerido pelo yupecube , a consulta pode ser simplificada para:
A única desvantagem é que os JOINs em condições funcionais complexas são, em geral, muito lentos.