Listar dados de tabela do meio – Mysql

Listar dados de tabela do meio – Mysql

Olá pessoal

O conteúdo deste post surgiu a partir de uma solicitação de um amigo meu da faculdade que me apoiou muito na empresa que trabalho, quando comecei a trabalhar. ( sabe como é.. aprendiz é fogo.. hehe )

Então nada mais justo que tentar recompensar, respondendo da melhor forma possível.

Problema

Montar uma forma otimizada de mostrar os registros de um relacionamento N para N, ou seja, trocando tudo por míudos:

Eu tenho a tabela Usuário, tenho a tabela Cursos.

Seria preciso mostrar no formulário de Usuários todos os Cursos cadastrados e os Cursos que o Usuário já se cadastrou.

Então bolei uma forma simples e otimizada usando recursos do banco de dados Mysql para mostrar isso:

cursos

Solução


# montamos a consulta aqui
$sql 	= "
  			SELECT
				c.cur_id	as cod_curso,
  				c.cur_nome 	as nome,
  				cs.usr_id 	as cod_usuario
  			FROM
  				curso c
  				LEFT JOIN curso_usuario cs ON
  				c.cur_id = cs.cur_id AND
  				cs.usr_id = '".$codigo_do_usuario."'";

# pronto, a sql está pronta, mostramos todos os registros do curso, com Left Join,
# para mostrar todos mesmo que não tenham ligação com a tabela curso_usuario
			$query 	= mysql_query($sql); # executa o sql
			while ($r = mysql_fetch_array($query)) { # lista todos os registros
				$sel = (!is_null($r['cod_curso']))?"checked='checked'":""; 	#verifica se tem relacionamento com a tabela do meio ou não
				echo sprintf('
<div><label><input type="checkbox" name="cursos[]" id="cursos[]" value="%s" %s />%s</label></div>
',
				$r['cod_curso'],$sel,$r['nome']);			#imprime o checkbox
			}

Funciona porquê?

O segredo é o LEFT JOIN ,  que faz mostrar todos os registros da tabela cursos, mesmo os que não possuem ligação com a tabela do meio.

No lugar de mostrar os registros, ele mostra NULL, ou seja, sem valor, o que tratamos na linha >

$sel = (!is_null($r['cod_curso']))?"checked='checked'":"";

Bom, é isso então..

FUI =)

  • http://www.evolutiondfm.com.br DIOGO

    Boa tarde achei interessante sou novo no php e fiquei com duvida para criar as tabela não consegui decifrar c. cs não entendi como eu create a tabela.

    obrigado otimo site

  • http://www.evolutiondfm.com.br DIOGO

    Boa tarde achei interessante sou novo no php e fiquei com duvida para criar as tabela não consegui decifrar c. cs não entendi como eu create a tabela.

    obrigado otimo site

  • http://weber.eti.br Luiz F. Weber

    Olá meu caro Diogo.
    Você tem 2 opções, ou ‘cria na mão’ executando o script sql dentro do servidor ou usa o phpmyadmin.
    Para criar na mão você faz assim:
    create table tabela1 (
    -> codigo int(10) not null auto_increment, — isso mostra que o campo é do tipo inteiro, com auto-incremento
    -> titulo varchar(80) null, — isso mostra que o campo será null e será do tipo string
    -> primary key (codigo) — aqui você define o campo codigo como chave primaria
    );

    ou usa este tutorial muito bacana:
    http://www.jack.eti.br/www/arquivos/apostilas/web/tutorialphpmyadmin.pdf

    Qualquer dúvida, me avise.

  • http://weber.eti.br/ Luiz Felipe

    Olá meu caro Diogo.
    Você tem 2 opções, ou ‘cria na mão’ executando o script sql dentro do servidor ou usa o phpmyadmin.
    Para criar na mão você faz assim:
    create table tabela1 (
    -> codigo int(10) not null auto_increment, — isso mostra que o campo é do tipo inteiro, com auto-incremento
    -> titulo varchar(80) null, — isso mostra que o campo será null e será do tipo string
    -> primary key (codigo) — aqui você define o campo codigo como chave primaria
    );

    ou usa este tutorial muito bacana:
    http://www.jack.eti.br/www/arquivos/apostilas/web/tutorialphpmyadmin.pdf

    Qualquer dúvida, me avise.

  • http://www.evolutiondfm.com.br DIOGO

    Bom dia; a minha não não é esta amigo. eu estou seguindo o a função que me passou acima

    c.cur_id as cod_curso,
    c.cur_nome as nome,
    cs.usr_id as cod_usuario

    então não entendi o que seria o c e o cs é o nome das tabelas.

    pois meu problema é o seguinte.

    estou com um grande problema.

    estou fazendo uma produto / tamanho e em uma relação de um para muitos não estou conseguindo trabalhar com check. exemplo fazer um update caso possa me ajudar ficarei grato. Obrigado pela atenção t+

  • http://www.evolutiondfm.com.br DIOGO

    Bom dia; a minha não não é esta amigo. eu estou seguindo o a função que me passou acima

    c.cur_id as cod_curso,
    c.cur_nome as nome,
    cs.usr_id as cod_usuario

    então não entendi o que seria o c e o cs é o nome das tabelas.

    pois meu problema é o seguinte.

    estou com um grande problema.

    estou fazendo uma produto / tamanho e em uma relação de um para muitos não estou conseguindo trabalhar com check. exemplo fazer um update caso possa me ajudar ficarei grato. Obrigado pela atenção t+

  • http://weber.eti.br Luiz F. Weber

    Aaaa, me desculpe então.
    O que eu fiz nesta sql foi renomear as tabelas para que fique mais fácil de manipular na consulta.
    FROM
    curso c -- renomeia curso para c
    LEFT JOIN curso_usuario cs ON -- renomeia curso_usuario para cs

    Senão seria necessário para que fizesse assim:

    $sql = "
    SELECT
    curso.cur_id as cod_curso,
    curso.cur_nome as nome,
    curso_usuario.usr_id as cod_usuario
    FROM
    curso
    LEFT JOIN curso_usuario ON
    curso.cur_id = curso_usuario.cur_id AND
    curso_usuario.usr_id = '".$codigo_do_usuario."'";

    Se ainda tiver dúvidas, me avise.

  • http://weber.eti.br/ Luiz Felipe

    Aaaa, me desculpe então.
    O que eu fiz nesta sql foi renomear as tabelas para que fique mais fácil de manipular na consulta.
    FROM
    curso c -- renomeia curso para c
    LEFT JOIN curso_usuario cs ON -- renomeia curso_usuario para cs

    Senão seria necessário para que fizesse assim:

    $sql = "
    SELECT
    curso.cur_id as cod_curso,
    curso.cur_nome as nome,
    curso_usuario.usr_id as cod_usuario
    FROM
    curso
    LEFT JOIN curso_usuario ON
    curso.cur_id = curso_usuario.cur_id AND
    curso_usuario.usr_id = '".$codigo_do_usuario."'";

    Se ainda tiver dúvidas, me avise.

blog comments powered by Disqus