| Maior acervo de vídeo aulas da web

Não consegue visualizar a vídeo aula?

Criando uma SubConsulta com SQL e PHP

Salve Amigos do VAB. Nessa vídeo-aula mostrei como realiza um SubConsulta, ou SubSelect no SQL e com PHP. Utilizarei um exemplo prático, quando temos que realizar uma pesquisa em duas tabelas relacionadas. Espero que goste. Boa Aula.

Códigos Utilizados: http://www.mxmasters.com.br/comunidade/viewtopic.php?f=50&t=4405&start=0

Você gostou dessa Vídeo Aula, então compartilhe com seus amigos

Artigos Relacionados

Comentários

  • http://tutorial-city.net Tutorial City

    outra maneira de se fazer isso é usando uma junção de JOIN com GROUP BY. A diferença básica é que dessa maneira não são retornadas as categorias que não estão ligadas a nenhum produto, que em quase 100% das vezes é exatamente o que se quer.
    Vou deixar mais uma SQL que pode ser interessante:
    Selecionar todas as categorias que não estão ligadas a um produto
    http://pastebin.com/zQsQNHci

    Abraços

    • http://www.videoaulasbrasil.com.br David CHC

      Boa alternativa tbm @Tutorial City, abrs.

      Quem tiver outra maneira de realizar esse procedimento, pode postar tbm, sempre interessante ver outras maneira de fazer.

  • http://www.blackfullhott.tk Rangel

    Muito bom, valeu David, tem como fazer uma aula sobre busca?
    ex: tenho um campo de busca onde tem que se buscar em 2 tabelas com campos distintos!!!

    Abss.

    • http://www.videoaulasbrasil.com.br David CHC

      @Rangel, as tabelas estão relacionadas, como no exemplo q fiz na video aula?

  • Rubia Dias

    Olá David! Ótima video aula como sempre! Uma forma muito mais prética como você falou e achei mais simples também.
    Obrigada por compartilhar.

    • http://www.videoaulasbrasil.com.br David CHC

      Obrigado @Rubia, eu até me corrigir, quando falei mais simples, rs. Pra mim é mais simples, mas tem n maneiras de fazer o mesmo procedimento.

  • allan

    cara muito boa a aula como sempre, só ta faltando uma video aula de como trabalhar com intervalos de datas e horarios

    • http://www.videoaulasbrasil.com.br David CHC

      @allan , no caso vc pode trabalhar com BETWEEN.

  • Rubia Dias

    Rs eu vi. No primeiro momento fiquei em dúvida se seria mais fácil também.rs Eu fazia como você falou, uma dentro da outra.Só que assim,ficou digamos até mais agradável o organizado.
    Foi a melhor explicação sobre o assunto que vi.
    Obrigada.

  • João

    Parabéns david, Boa VA. Eu Ultilizava Select’s dentro do Loop e dps comecei a usar JOIN, mas assim eu achei mais fácil

    • http://www.videoaulasbrasil.com.br David CHC

      @João, tem casos e casos. Nesse caso especifico, vc pode usar uma SubConsulta, pq quero restringir uma situação, no caso escolhi pela opção da contagem de registros, poderia fazer com @tutorial city postou, usando resultado da tabela produtos ,no caso. Se pudermos reduzir a solicitação no banco de dados, é melhor.

  • http://www.blackfullhott.tk Rangel

    David, minhas tabelas nao estão relacionadas!

    já tentei outras formas e não deu certo..

    abss.

    • http://www.videoaulasbrasil.com.br David CHC

      @ Rangel, no caso vc deve ter feito algo assim: Uma tabela para servicos, uma tabela para clientes, uma tabela para produtos, e assim vai, cada pagina uma tabela. Nessa caso, isso não é indicado, pq maioria das paginas tem a mesma estrutura. Imagina se vc tive 10 categorias, seria 10 tabelas, e assim vai. Mas vc pode fazer o seguinte, realizar buscas individuais, e retorna num array, e depois mesclar esses array, exemplo:

      http://pastebin.com/pivA6NWT

  • http://tutorial-city.net Tutorial City

    Falei lá em baixo da junção mas esqueci de deixar a SQL. Aqui está: http://pastebin.com/sUHHYtQe

    Rodei um benchmark simples, pra ver qual das duas SQLs eram mais rápidas (usando join ou subselect), e com 10mil iterações os resultados obtidos foram:

    Join: 9.4237
    Subselect: 8.3701

    A diferença é bem considerável, e contrária do que eu imaginava inicialmente. Conforme os subselects forem ficando mais complexos acredito que essa diferença seja invertida, mas aí só rodando testes pra confirmar.

    Pra quem quiser ver o teste que rodei, aí vai o script PHP:
    http://pastebin.com/MfApQSZP

    tabela usada:
    http://pastebin.com/8KMsycyA

    Fiz dez testes para cada SQL, e depois rodei essa SQL no banco de dados:
    http://pastebin.com/axuWFkCd

    Abraços

    • http://www.videoaulasbrasil.com.br David CHC

      @Tutorial City, talvez com JOIN , fazemos maiores interaçoes, no caso, preciso contar o total, junta as tabelas, agrupa-las. No SubSelect, o conteudo total de uma tabela com relacionamento simples. Podendo até tentar contar o total de um item da tabela.( em vez de usar o asterisco, usa um campo, apesar de já ler algo relacionado q diz usando o asterisco é mais rapido na contagem, e outros com o campo é mais rapido).

      Realmente dependendo da complexibilidade da SQL deve diminui o tempo, mas como vc falou, só testando mesmo.

  • Vitor Paulo

    Olá, estava acompanhando esses comentários e tenho seguinte dúvida!!!
    tenho essas 2 tabelas, e gostaria que na hora que o usuário fizesse uma busca no site exibisse os resultados,
    a onde tiver o nome q ele buscou fosse exibido só que nome exatamente que ele se refere!!

    CREATE TABLE `gringo` (
    `id_gringo` int(11) NOT NULL auto_increment,
    `nome_gringo` varchar(200) NOT NULL,
    `titulo_gringo` varchar(200) NOT NULL,
    `mensagem_gringo` longtext NOT NULL,
    `link_gringo` varchar(200) NOT NULL,
    `data` date NOT NULL,
    PRIMARY KEY (`id_gringo`)
    )

    CREATE TABLE `postagens` (
    `id` int(11) NOT NULL auto_increment,
    `nome` varchar(200) NOT NULL,
    `titulo` varchar(255) NOT NULL,
    `mensagem` longtext NOT NULL,
    `link` varchar(255) NOT NULL,
    `data` date NOT NULL,
    `hora` time NOT NULL,
    PRIMARY KEY (`id`)
    )

    Valeu.

  • Vitor Paulo

    Opá, valeu David, porém a consulta traz até o que não quero, como faço pra trazer somente o que pesquisei na busca?

    valeu.

    • http://www.videoaulasbrasil.com.br David CHC

      @Vitor , no caso vc está realizando uma busca normal, irá retornar de acordo com filtro q vc esta fazendo. O q foi feito foi apenas colocar esse resultado em um array, e depois juntar esses array’s para mostrar os resultados juntos.

  • Vitor Paulo

    valeu David, ja consegui trazer apenas o que realmente foi pesquisado :P ..
    só tem mais um detalhe, tenho q trazer o link, pra download, no meu caso posto um http:// com link de onde está hospedado o arquivo, mas no echo nao to conseguindo trazer o link junto com nome q foi pesquisado
    só isso e ja era fechou tudo….

    • http://www.videoaulasbrasil.com.br David CHC

      @Vitor Paulo, basta modelar no array da resposta:

      $result[] = array(“id”=> $v['id_gringo'], “titulo” =>$ln[''titulo_gringo]“, “link” => $ln['link_gringo]);

      TABELA postagens

      $result[] = array(“id”=> $v['id'], “titulo” =>$ln[''titulo], “link” => ”);

      E para listar:

      foreach($resultado as $k => $v){
      echo ‘Titulo ‘.$v['titulo'];
      echo ‘Link ‘.$v['link']
      }

      Nesse caso, vc saberá se o valor do link estiver vazio, basta usar o empty pra isso. Ai é só adaptar a suas necessidade. Recomendo vc dá uma estuda em Formas Normais em relação a banco de dados, pra entender melhor sobre modelagem de banco de dados.

  • Leonardo

    Excelente. Poderia fazer com o uso de joins: inner join, left outer join, right outer join, full outer join.

    Quando tento fazer uma consulta, por exemplo:
    “select f.nome, d.dependente from funcionario f inner join dependente d on (f.cod_func=d.cod_func) where cod_func = ‘$cod’ “;

    sempre gera um erro na função mysql_fetch_assoc.

    • http://www.videoaulasbrasil.com.br David CHC

      @Leonardo, tente especificar a tabela tbm na hora de filtrar WHERE:


      SELECT f.cod_func, d.cod_func, f.nome, d.dependente FROM funcionario f INNER JOIN dependente d ON f.cod_func= d.cod_func WHERE f.cod_func = ‘$cod’

  • Vitor Paulo

    valeu, vou testar essa sua dica, e estudar mais…forte abss…continue com as v.a! :P

  • Marcio Vinicius

    Ótima VA David, eu jamais deixo de ver uma Aula sua, está de parabéns!!!

  • omor

    Olá Davi muito boa a sua vídeo aula, estou aproveitando esse comentário pra pedir a você se possível fazer uma vídeo aula de um sistema de finalizar compra daquele carrinho que você postou aqui. Obrigado!

  • Paulo

    David, parabéns pelo tutorial. Nem imaginava que isso era possível com Mysql. Sem dúvida seus vídeos são os melhores.

    • http://www.videoaulasbrasil.com.br David CHC

      Obrigado @Paulo.. Realmente Paulo, as vezes não vasculhamos todo o potencial do SQL, q pode facilitar muito a nossa vida. Mas tem muita video aula boas de outros autores aqui no VAB e no MxMasters, tenho certeza q irá te ajudar nesse processo de aprendizado.

  • Rogério

    Show suas aulas, você está de parabéns.

    • http://www.videoaulasbrasil.com.br David CHC

      vlw @Rogério

  • urbano

    Olá David, td bem; pode tirar uma dúvida minha de sql?
    é o seguinte, tenho 3 tabelas, cada tabela tenho um campo chamado novidade cujo conteudo pode ser ‘S’ ou nada.
    quero fazer uma consulta nas tres tabelas para mostrar apenas as linhas onde o campo ‘novidade’ de cada tabela seja ‘S’. soh que quando faço a consulta, da maneira como faço, que acho que talvez naoseja a correta, as linhas estão vindo duplicadas. como resolver isto?
    vamos sugerir que as tabelas seja.
    tabelas: fotohomens, fotomulheres, fotocriancas.
    a consulta que fiz foi assim:
    SELECT * FROM fotohomens, fotomulheres, fotocriancas where fotohomens.novidade = ‘S’ AND fotomulheres.novidade = ‘S’ AND fotocriancas.novidade = ‘S’ – dessa forma vem duplicado.
    Valeu

    • http://www.videoaulasbrasil.com.br David CHC

      @urbano, vamos pensar nessas tabelas, como é a estrutura dela? É necessário ser 3 tabelas? Pq dependendo poderia ser algo assim:


      TABELA fotos
      idFoto
      arquivoFoto
      legendaFoto
      novidadeFoto
      tipoFoto

      o campo tipoFoto vai dizer se é foto de homem, mulher ou criança.

  • urbano

    David, na verdade eu fiz assim:
    1 tabela chamada tb_homens com todos os dados
    1 tabela chamada tb_mulheres com todos os dados
    1 tabela chamada tb_crianca com todos os dados

    1 tabela chamada tb_fotohomens com o id_foto, foto, novidade, id_homens(referenciado a tabela tb_homens

    1 tabela chamada tb_fotomulheres com o id_foto, foto, novidade, id_mulheres(referenciado a tabela tb_mulheres

    e

    1 tabela chamada tb_fotocrianca com o id_foto, foto, novidade, id_crianca(referenciado a tabela tb_crianca.

    nas tabelas tb_fotoshomens, tb_fotosmulheres, tb_fotocriancas, o campo novidade poder ser preenchido com ‘S’.

    O que eu queria era fazer um select em todas as tabelas tb_fotos… para listar as fotos apenas cujo campo novidade estiver preenchido com ‘S’.

    value!!

    • http://www.videoaulasbrasil.com.br David CHC

      @urbano, é bom sempre pensar na modelagem das tabelas com cuidado, se todas tem a mesma estrutura, é bom pensar em condensá-la. Então, se suas tabelas tem os mesmo campos vc pode usar o UNION

      http://www.linhadecodigo.com.br/Artigo.aspx?id=945

  • urbano

    David, valeu pelo comentário; se eu tivesse pensando numa modelagem correta teria passado por isso, como disse. Se ao invés de eu ter criado aquelas 3 tabelas com fotos para cada tipo, criaria somente uma e um campo, como disse, chamado tipopessoa informando se era crianca, mulher ou homem.
    Valeu!!

  • Gilson

    boa noite surgiu uma duvida, caso possa me ajudar favor enviar resposta para meu e-mail gaucho.gilson@hotmail:disqus .com. Possuo 2 tabelas ligadas via INER JOIN, MOTOCICLETAS E CORRIDAS, no Form Corridas possuo um DBLookCombobox, onde quero apresentar no evento OnEnter apenas as MOTOCICLETAS com Situação ATIVO na Tabela MOTOCICLETAS e q ao estejam participando de nenhuma Corrida, fiz 2 sql separadas, mas nao consegui uni-las para gerar um resultado unico.

    1-MOSTRA APENAS AS MOTOCICLETAS ATIVAS…
    with dm.ZQ_motocicletas do
                begin
                  Close;
                  with sql do
                  begin
                    Clear;
                    Add (‘ select * from motocicletas’);
                    Add (‘ where motocicletas.MOT_situ = “ATIVO” ‘);
                  end;
                  Open;

    2-MOSTRA APENAS AS MOTOCICLETAS LIVRES, QUE NAO ESTAO EM UMA CORRIDA EM ANDAMENTO…
    with dm.ZQ_motocicletas do
      begin
        Close;
          with SQL do
             begin
                 Clear;
                 Add(‘ select motocicletas.*, corridas.COR_status ‘);
                 Add(‘ from corridas ‘);
                 Add(‘ inner join motocicletas on motocicletas.MOT_cd = corridas.MOT_cd ‘);
                 Add(‘ where corridas.COR_status “ANDAMENTO” ‘);
             end;
             Open;

    3-COMO UNIR ISTO EM UMA SÓ PESQUISA????

    • http://davidchc.wordpress.com David CHC

      Pelo que eu entendi vc quer mostrar a motocicletas ativas, onde status da corrida deseja em andamento, seria isso ?

      SELECT * FROM corrida c
      INNER JOIN motocicleta m ON c.MOT_cd = m.MOT_cd
      WHERE c.COR_status = ‘ANDAMENTO’ AND m.MOT_situ = ‘ATIVO’


Hospedado por Hostnet - Hospedagem de sites

VAB - Todos os direitos reservados - 2008 / 2012

Developed by: MX Web Studio

Mais em PHP (148 of 199 articles)