Jump to content

Archived

This topic is now archived and is closed to further replies.

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

  • Similar Content

    • By alysson122010
      Galera estou começando a trabalhar com datatables porem tenho uma dificuldade pq tipo até 200 registros por pagina é aceitavel mas penso quando tiver 2000 registro carregar tudo numa pagina so da errado pq é muitos dados e pode travar tudo.
      Como posso fazer para listar com limite por pagina ou alguma maneira para poder colocar varios dados sem travar.
       
      estou usando assim:
      <script type="text/javascript">        $(document).ready(function() {             $('#example').DataTable({         "order": [[ 0, "desc" ]],         "language": {             "url": "//cdn.datatables.net/plug-ins/1.10.21/i18n/Portuguese-Brasil.json"         }     });         } );        </script> <table id="example" class="table table-striped table-bordered" style="width:100%">         <thead>             <tr>                 <th>Name</th>                 <th>Position</th>                 <th>Office</th>                 <th>Age</th>                 <th>Start date</th>                 <th>Salary</th>             </tr>         </thead>         <tbody>             <tr>                 <td>Tiger Nixon</td>                 <td>System Architect</td>                 <td>Edinburgh</td>                 <td>61</td>                 <td>2011/04/25</td>                 <td>$320,800</td>             </tr>             <tr>                 <td>Garrett Winters</td>                 <td>Accountant</td>                 <td>Tokyo</td>                 <td>63</td>                 <td>2011/07/25</td>                 <td>$170,750</td>             </tr>             <tr>                 <td>Ashton Cox</td>                 <td>Junior Technical Author</td>                 <td>San Francisco</td>                 <td>66</td>                 <td>2009/01/12</td>                 <td>$86,000</td>             </tr>             <tr>                 <td>Cedric Kelly</td>                 <td>Senior Javascript Developer</td>                 <td>Edinburgh</td>                 <td>22</td>                 <td>2012/03/29</td>                 <td>$433,060</td>             </tr>             <tr>                 <td>Airi Satou</td>                 <td>Accountant</td>                 <td>Tokyo</td>                 <td>33</td>                 <td>2008/11/28</td>                 <td>$162,700</td>             </tr>             <tr>                 <td>Brielle Williamson</td>                 <td>Integration Specialist</td>                 <td>New York</td>                 <td>61</td>                 <td>2012/12/02</td>                 <td>$372,000</td>             </tr>             <tr>                 <td>Herrod Chandler</td>                 <td>Sales Assistant</td>                 <td>San Francisco</td>                 <td>59</td>                 <td>2012/08/06</td>                 <td>$137,500</td>             </tr>             <tr>                 <td>Rhona Davidson</td>                 <td>Integration Specialist</td>                 <td>Tokyo</td>                 <td>55</td>                 <td>2010/10/14</td>                 <td>$327,900</td>             </tr>             <tr>                 <td>Colleen Hurst</td>                 <td>Javascript Developer</td>                 <td>San Francisco</td>                 <td>39</td>                 <td>2009/09/15</td>                 <td>$205,500</td>             </tr>         </tbody>         <tfoot>             <tr>                 <th>Name</th>                 <th>Position</th>                 <th>Office</th>                 <th>Age</th>                 <th>Start date</th>                 <th>Salary</th>             </tr>         </tfoot>     </table> <script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script> <script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.22/js/dataTables.bootstrap4.min.js"></script>  
    • By helkton
      iai galera fiz o seguinte script pra fazer uma busca em uma tabela Mysql via php, quando o usuario digita algo em um formulario ele é disparado e faz as devidas buscas na tabela
      $('#buscarAlunoOnline').keyup(function(){ var buscarAlunoOnline = $('#buscarAlunoOnline').val(); if(buscarAlunoOnline === ""){ var qdade_result_pagina = 50; //Quantidade de Registros por pagina var pagina = 1; //pagina inicial var idLocalidade = <?php echo $unidadeTrabalho?>;//localidade de trabalho do funcionario logado var tipoLogin = <?php echo $tipoLogin?>;//tipo de funcionario logado $(document).ready(function (){ listar_alunos(pagina, qdade_result_pagina, idLocalidade, tipoLogin);//Chama funcao para mostrar resultados }); function listar_alunos(pagina, qdade_result_pagina, idLocalidade, tipoLogin){ var dados = { pagina: pagina, qdade_result_pagina: qdade_result_pagina, idLocalidade: idLocalidade, tipoLogin: tipoLogin } $.post('listar_alunos_ead_db', dados , function(data){ $('#resultAlunOnline').html(data); }); } }else{ $.post('buscar_aluno_ead', {buscarAlunoOnline: buscarAlunoOnline, idLocalidade: <?php echo $unidadeTrabalho?>, tipoLogin: <?php echo $tipoLogin?>},function(data){ $('#resultAlunOnline').html(data); }); } }); até aqui tudo bem funcionou, o usuario digita, é disparado e chama a função buscar_aluno_ead, quando a pagina é aberta sem nenhuma busca eu chamo a função listar_alunos_ead_db 
       
      agora o b.o é o seguinte eu tinha uma janela modal que se abria pra poder fazer algumas alterações e edições, que parou de funcionar devido essa coisa que fiz, antes funcionava, antes de chamar as paginas assim via javaScript, o que posso fazer pra arrumar????
    • By Kellison Ruan
      Acho que não fui tão claro no título, portanto irei esmiuçar melhor aqui...
       
      É o seguinte, quero saber se há algum jeito de pegar as linhas de uma coluna q está em VARCHAR com informações do tipo "4 PONTOS DE ILUMINAÇÃO", dessa informação pretendo retirar somente o número que em questão é o "4" e colocá-lo em outra coluna INTEGER. Há essa possibilidade? Detalhe, as vezes as informações não está seguindo um padrão de vim somente como "4 PONTOS DE ILUMINAÇÃO" às vezes vêm dados com mais informações númericas que precisa distinguir, por exemplo, a mim só interessa pegar números que vem antecedendo as palavras "PONTOS", "PTOS", "PTS", têm algum jeito de distinguir isso?
    • By Kakaroto1309
      Preciso de uma ajuda para conectar com o banco. Estava tudo funcionando normalmente com MYSQL agora parou tudo e estou tentando trocar para MYSQLI.
      Não acho o erro, já tentei de tudo.
       
      connection.php
      <? function conecta() { $host = "localhost"; $user = "admin"; $pass = "123456789"; $db = "principal"; //Conexão $conexao = mysqli_connect($host, $user, $pass) or die("Erro na conexão:".mysqli_error()); //Selecionar BD mysqli_select_db($conexao,$db) or die("Erro ao selecionar BD"); } function desconecta() { mysqli_close(); } ?> validate.php
      <? if (empty($_POST) and (empty($_POST['cpUsuario']) OR empty($_POST['cpSenha']))) { header("Location: ../login.php"); exit; } else { include("connection.php"); conecta(); $varUsuario = $_POST['cpUsuario']; $varSenha = sha1($_POST['cpSenha']); $stt = "SELECT ID,txNome,txNivel FROM tbUsuario WHERE txUsuario='$varUsuario' and txSenha='$varSenha' LIMIT 1"; $sql = mysqli_query($conexao,$stt) or die(mysqli_error($conexao)); $existe = mysqli_num_rows($sql); if ($existe == 0) { echo "Login invalido ou inexistente na base"; exit; } else { $resultado = mysqli_fetch_assoc($sql); if (!isset($_SESSION)) { session_start(); } $_SESSION['UsuarioID'] = $resultado['ID']; $_SESSION['UsuarioNOME'] = $resultado['txNome']; $_SESSION['UsuarioNIVEL'] = $resultado['txNivel']; header("Location: ../menu.php"); exit; } } ?> O erro agora está dando o seguinte:
      PHP Warning:  mysqli_query() expects parameter 1 to be mysqli, null given in /home4/public_html/connection/validate.php on line 17
       
      Linha 17 é essa:
      $sql = mysqli_query($conexao,$stt) or die(mysqli_error($conexao));
       
      Se eu tiro o $conexao do mysqli_query ele da erro de "mysqli_query() expects at least 2 parameters, 1 given" e se eu coloco o erro é "mysqli_query() expects parameter 1 to be mysqli, null given"
       
      Alguem sabe como posso resolver isso?
    • By OSVALDO ARANTES JÚNIOR
      Boa tarde,  estou desenvolvendo uma consulta no php/mysql em diversas colunas. E gostaria de saber
      se existe um caracter especial para listar todos os dados, minha quere esta organizada da seguinte forma
       
      $query = sprintf("SELECT * FROM operacao  WHERE data_operacao BETWEEN '$data_inicial_rel' AND '$data_final_rel' AND estado_operacao = ' ' ORDER BY id_operacao ASC ;");
       
      quando declaro o valor do estado_operacao ele lista perfeitamente o valor, agora minha dúvida é se existe um 
      carater para listar todos os valores... para que eu use como value no opition do select, passar o valor TODOS pra a query
       
      desde já agradeço a atenção.
×

Important Information

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