Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia a todos.
Tenho três tabelas, a, b e usuarios, a estrutura está abaixo. Preciso listar todas as descrições de A que não possuam ocorrencia em B para determinado usuario. Em B pode haver ocorrencias de A para outros usuarios, que não devem ser retornados. Desta forma deve ser retornado as descricoes de A ignorando as que estiverem atribuidas à usuário X, o que tiver atribuido à outros usuários não faz diferença.
Estou usando MySQL 5.6.17, então excepts ou not exist não rola. O not in me parecia uma boa saída, só que caso não tenha nem uma ocorrência de determinado usuário na tabela b, não retorna nada.
Tabela a: cod, descricao
Tabela b: cod, cod_a, cod_usuario
Tabela usuarios: cod, cod_usuario
Segue uma tentativa em vão:
SELECT a.cod,
a.descricao
FROM xxxxxxxxx a
left outer join xxxxxxxxx b on a.cod = b.cod_a
WHERE b.cod_usuario <> 2
Alguém tem ideia de que forma pode ser resolvido isto? Minha ideia inicial era dois selects com excepts, mas foi por água abaixo por ser MySQL.
Obrigado!
Motta, obrigado pela resposta, mas como havia descrito:
NOT EXISTS não é suportado pelo MySQL 5.6.17.
NOT IN caso não tenha nem uma ocorrência de determinado usuário na tabela b, não retorna nada.
OUTER JOIN testando se é nulo não supre a necessidade para um usuário específico.
Posso ter feito algo errado ou estar equivocado nessas informações, sabes dizer se isso procede?
WHERE b.cod_usuario <> 2 and b.cod_a is null
Não entendi este "diferente de dois"
O dois é o código do usuário que eu estava usando pra teste, desculpe. No caso foi uma tentativa de filtrar o que já existia pro usuário.
Então bastaria , creio eu , isto.
...
WHERE b.cod_a is null
Pior que não, tentei aqui, não retorna nada daí.
Tentando pensar fora da caixa:
Objetivo:
Listar as descrições não relacionadas à um usuário.
Observações:
Apesar de ser contra, estou cogitando tratar isto na aplicação. Haveria outra saída?
Estou num tablet , ruim de editar senão tentava algo com NOT IN , mas já perdi a conta das vezes que fiz isto , das 3 maneiras.
O not in funciona, porém apenas se tiver algum registro pro usuário. No caso de usuário novo, que não tem registro, fica zerado. O ideal seria o not exists, mas não tá rolando nessa versão.
tem como vc postar um exemplo de dados e a resposta desejada? pra mim ta mto confuso. Tanto um left quando um not in deveriam resolver.
Motta e giesta, obrigado pelas respostas!
Por fim consegui chegar à solução. Não sei explicar ao certo o que estava dando de errado com o comando not exists, mas funcionou da seguinte forma:
SELECT DISTINCT
a.cod,
a.descricao
FROM
xxxxxxxxx a
WHERE
NOT EXISTS (
SELECT b.cod_pss
FROM xxxxxxxxx b
WHERE a.cod = b.cod_a
AND b.cod_usuario = 2
)
Espero futuramente ser útil à alguém.
Abraços.
Use
NOT EXISTS
ou
NOT IN
ou
OUTER JOIN testando se a chave do outer join é nula.