Jump to content
luanlazzarin

Select ignorando ocorrências em outra tabela

Recommended Posts

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!

Share this post


Link to post
Share on other sites

Use

 

NOT EXISTS

 

ou

 

NOT IN

 

ou

 

OUTER JOIN testando se a chave do outer join é nula.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

WHERE b.cod_usuario <> 2 and b.cod_a is null

 

 

Não entendi este "diferente de dois"

Share this post


Link to post
Share on other sites

Então bastaria , creio eu , isto.

 

...

WHERE b.cod_a is null

Share this post


Link to post
Share on other sites

Tentando pensar fora da caixa:

 

Objetivo:

Listar as descrições não relacionadas à um usuário.

 

Observações:

- As descrições já podem estar relacionadas à outros usuários.

- Determinada descrição pode já estar relacionada ao usuário, neste caso, retornar as outras.

 

Apesar de ser contra, estou cogitando tratar isto na aplicação. Haveria outra saída?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Diego-SLP
      Bom dia,
       
      Estou fazendo uma tela de relatorios de registro de ponto e não estou conseguindo totalizar as horas conforme trago do banco de dados, se alguem puder me ajudar.
       
      SELECT p.cod_obra,f.nome,o.obra, TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(p.totalhora))),'%H:%i') AS hora, TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(p.totalhoraextra))),'%H:%i') AS horaextra, f.funcao FROM rh_pontoFuncionario p, rh_funcionario f, rh_obra o WHERE p.data BETWEEN '2020/10/01' AND '2020/11/20' AND p.cod_obra = '20056' AND p.cod_func = f.cod AND p.cod_obra = o.cod GROUP BY p.cod_obra, f.nome Essa query me traz COD_OBRA,NOME,OBRA,HORA,HORAEXTRA,FUNCAO e eu gostaria de TOTALIZAR o campo HORA e HORAEXTRA somando todas as linhas mas não consigo
    • By landerbadi
      Olá pessoal, boa noite
       
      Tenho uma tabela no banco de dados mysql com três colunas (id, audio, tocado) e um player de audio html5 simples.
       
      <audio controls>
        <source src="horse.ogg" type="audio/ogg">
        <source src="horse.mp3" type="audio/mpeg">
      </audio>
       
      Fiz uma consulta no bd para me retornar um (1) registro. Com base nessa consulta o player toca o audio correspondente.
      Preciso fazer com que após o término do audio seja gravado na coluna 'tocado' no bd a palavra 'OK'.
      Tem como fazer isso?
    • By Matheus B. Siqueira
      Olá, tento fazer uma requisição para atualização de item do accordion no mysql, porém apenas um item é atualizado.
      O código funciona da seguinte forma: É buscado perguntas referente ao vídeo selecionado no carousel, logo após, o código da Amostra de Código 1, cria os cards dentro do modal. Cada card é referente a uma pergunta diferente registrada no Banco de Dados.
      Porém, ao tentar atualizar um item do MYSQL, dentro do card, no textarea, o primeiro item (1º pergunta) desse accordion é atualizado, o segundo item (2º pergunta) não é atualizado.
      Cada pergunta possui um id no MYSQL, bem como, um assunto, uma resposta, uma pergunta... de acordo com a Figura 01.
      Vale ressaltar que, de acordo com a Amostra de Código 2, é buscado juntamente com o AJAX, todas as perguntas referente ao vídeo selecionado no carousel.
      Amostra de Código 1:
      $(document).ready(function() { $(function() { $('#responder_duvidas').click(function() { var codigoVideo2 = $('.carousel-item.active').attr('data-link_video'); var accordion2 = ""; $.post("buscar_duvida_monitor_resp.php", { codigo_video_monitor: codigoVideo2, }, function(data2, status) { if (data2 !== "Fail") { $("#dynamic_accordion #accordion").html(accordion2); // Adiciona essa linha $.each(JSON.parse(data2), function (index2, duvida3) { accordion2 += '<div class="card" style="margin: 5px">'; accordion2 += '<div class="card-header" id="heading'+index2+'">'; accordion2 += '<h5 class="mb-0">'; accordion2 += '<button class="btn btn-link" data-toggle="collapse" data-target="#collapse'+index2+'" aria-expanded="true" aria-controls="collapse'+index2+'">'; accordion2 += duvida3.assunto; accordion2 += '</button>'; accordion2 += '</h5>'; accordion2 += '</div>'; accordion2 += '<div id="collapse'+index2+'" class="collapse" aria-labelledby="heading'+index2+'" data-parent="#accordion">'; accordion2 += '<div class="card-body">'; accordion2 += '<div style="background: #ddd; color #fff; padding: 10px 20px; border-radius: 5px">'; accordion2 += duvida3.pergunta; accordion2 += '</div>'; accordion2 += '<hr>'; accordion2 += '<div style="background: #fff; color #fff; padding: 10px 20px; border-radius: 5px">'; accordion2 += '<form method="post" enctype="multipart/form-data">'; accordion2 += '<textarea class="form-control" name="resposta" id="resposta" required>'+duvida3.resposta+'</textarea>'; accordion2 += '<input type="hidden" id="id_duvidas" value="'+duvida3.idduvidas+'" />'; accordion2 += '<br><button type="button" id="enviar_resposta" class="btn btn-success btn-sm">Enviar resposta</button>'; accordion2 += '</form>'; accordion2 += '</div>'; accordion2 += '</div>'; accordion2 += '</div>'; accordion2 += '</div>'; $("#dynamic_accordion #accordion").html(accordion2); }); } }); }); $(document).on("click", "#enviar_resposta",function(){ $.ajax({ url: "atualizar_resposta.php", method: "POST", data: { resposta: $('#resposta').val(), idduvidas: $('#id_duvidas').val() }, success: function(res) { var data = JSON.parse(res); alert((data.success == true) ? "Pergunta atualizada" : "Pergunta não atualizada"); $('.modal-backdrop').remove(); return; } }); // fecha modal $("#modalDuvidas").modal("hide"); }); }); }); Figura 1:

       
       
      Amostra de Código 2:
      <?php if (isset($_POST['idduvidas']) && isset($_POST['resposta'])) { $id_resposta = $_POST['idduvidas']; $resposta = $_POST['resposta']; $servidor = 'localhost'; $usuario = 'root'; $senha = 'root'; $banco = 'onteach'; $conexao = mysqli_connect($servidor,$usuario,$senha,$banco); $consulta2 = "UPDATE duvidas SET duvidas.resposta = '$resposta' WHERE duvidas.idduvidas = '$id_resposta'"; die(json_encode(['success'=>(mysqli_query($conexao, $consulta2))])); } Figura 2 (FIGURA COMPLEMENTAR APRESENTANDO O ACCORDION NO WEBSITE)

       
      Por fim, este tópico auxilia em um tema que é específico, porém, pode ser utilizado para outros fins de programação, bem como, a utilização de definição de váriantes em accordion com maiores itens.
      Desde já, agradeço.
       
    • By gersonab
      tenho uma data no BD , gostaria de mostrar ela 15 dias antes, montando um alerta 15 dias antes desta data
      atualmente utilizo assim, porém me mostra 15 dias após.
      $data = DateTime::createFromFormat('d/m/Y', $datab); $data->add(new DateInterval('P15D')); tipo:
      se eu colocar a data 24/11/2020 , ela vai me mostrar 09/12/2020 , quando preciso q mostre 09/11/2020.
    • By david2007
      Endpointer Framework é um Framework PHP para construção de APIs REST com Programação Procedural.
       
      Todas as regras de negócio são implementadas como Stored Procedures.
       
      http://endpointer.com
       
      Endpointer Framework é Código Aberto sob a licença MIT

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.