Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Lógica correta? Joins?


Botty

Pergunta

Bem fiz uma pesquisa detalhada no fórum, mas não consegui achar a solução.

Tenho noção em trabalhar com relacionamento de tabelas, mas não to conseguindo relacionar mais de duas.

Segue SQL:

CREATE TABLE `banda` (
`banda_id` int(11) NOT NULL auto_increment,
`bd_nome` text NOT NULL,
`bd_release` text NOT NULL,
`estilo_id` int(11) NOT NULL,
`bd_telefone` text NOT NULL,
`bd_email` text NOT NULL,
`bd_site` text NOT NULL,
`bd_capa` varchar(150) NOT NULL,
`bd_status` text NOT NULL,
`contbanda` text NOT NULL,
`bd_filiacao` date NOT NULL,
PRIMARY KEY (`banda_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

CREATE TABLE `comentarios` (
`coments_id` int(11) NOT NULL auto_increment,
`cm_comentario` text NOT NULL,
`cm_data` timestamp NOT NULL default CURRENT_TIMESTAMP,
`banda_id` int(11) NOT NULL,
`cm_aprovado` text NOT NULL,
PRIMARY KEY (`coments_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE `estilos` (
`estilos_id` int(11) NOT NULL auto_increment,
`estilo` text NOT NULL,
PRIMARY KEY (`estilos_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

CREATE TABLE `fotos` (
`foto_id` int(11) NOT NULL auto_increment,
`foto` text NOT NULL,
`banda_id` int(11) NOT NULL,
`contfoto` text NOT NULL,
PRIMARY KEY (`foto_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE `integrantes` (
`int_id` int(11) NOT NULL auto_increment,
`int_nome` text NOT NULL,
`int_instrumento` text NOT NULL,
`int_foto` text NOT NULL,
`int_email` text NOT NULL,
`int_site` text NOT NULL,
`int_nascimento` text NOT NULL,
`int_influencias` text NOT NULL,
`int_release` text NOT NULL,
`banda_id` text NOT NULL,
PRIMARY KEY (`int_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

CREATE TABLE `musicas` (
`musica_id` int(11) NOT NULL auto_increment,
`pl_musica` text NOT NULL,
`banda_id` int(11) NOT NULL,
PRIMARY KEY (`musica_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE `videos` (
`video_id` int(11) NOT NULL auto_increment,
`vd_url` varchar(150) NOT NULL,
`banda_id` int(11) NOT NULL,
`vd_descricao` text NOT NULL,
PRIMARY KEY (`video_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
[/codebox]

A parte de cadastrar, editar e deletar do BD, sem problemas, mas a página q irá exibir dados da banda que to com dificuldades. A lógica é a seguinte:

A banda possui um estilo musical (associar estilo e banda consegui fazer)

[code]mysql_select_db($database_conexao, $conexao); $query_rs1 = sprintf("SELECT * FROM banda INNER JOIN estilos ON banda.estilo_id = estilos.estilos_id  WHERE banda_id = %s", $colname_rs1);[/code]

Mas prescaria fazer as seguinte conexões também:

- Exibir as fotos que tenham a id da banda.

- Exibir os videos e musicas da Banda.

- Exibir os integrantes da banda.

- Exibir os comentários da banda.

Ai que não conseguindo, fazer uma relação maior.. sempre dá erro.

Alguém pode me ajudar? Como seria essa relação.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Na realidade Beraldo, de tando desfazer aki não ta exibindo o erro, ate parei de mexer até alguém me dar uma luz, era o erro: in where clause is ambiguous.

Gostaria de ver como fazer a sql correta para amarrar todas as tabelas conforme expliquei.

Link para o comentário
Compartilhar em outros sites

  • 0

O ideal é definir quais os dados quer mostrar, pra evitar estas "ambiguidades".

Quando você coloca só o *, quer dizer que quer que apareça todos os atributos de todas as tabelas que você incluiu na pesquisa.. Logo, se em uma tabela houver codigo e na outra também houver um atributo com o mesmo nome, vai dar este erro..

O melhor é fazer assim:

SELECT tb.*, te.estilo FROM bandas tb INNER JOIN estilos te ON .....

O tb e te são apelidos para as tabelas, para ficar mais fácil na codificação.

Link para o comentário
Compartilhar em outros sites

  • 0

Colocando:

SELECT *
FROM banda INNER JOIN estilos ON estilos.estilos_id = banda.estilo_id AND integrantes.banda_id = banda.banda_id, integrantes
WHERE banda_id = colname
da o erro de ambiiguidade. e
SELECT banda., integrantes. *
FROM banda INNER JOIN estilos ON estilos.estilos_id = banda.estilo_id AND integrantes.banda_id = banda.banda_id, integrantes
WHERE banda_id = colname
da outro erro.. e eu ainda nem tentei juntar as outras tabelas.. alguém não conseguiria fazer esse select pra mim? No codigo ta assim:
<?php
$colname_rs1 = "-1";
if (isset($_GET['banda_id'])) {
  $colname_rs1 = (get_magic_quotes_gpc()) ? $_GET['banda_id'] : addslashes($_GET['banda_id']);
}
mysql_select_db($database_conexao, $conexao);
$query_rs1 = sprintf("SELECT * FROM banda INNER JOIN estilos ON estilos.estilos_id = banda.estilo_id AND integrantes.banda_id = banda.banda_id, integrantes WHERE banda_id = %s", $colname_rs1);
$rs1 = mysql_query($query_rs1, $conexao) or die(mysql_error());
$row_rs1 = mysql_fetch_assoc($rs1);
$totalRows_rs1 = mysql_num_rows($rs1);
?>

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui aki depois de muito tentar.. em vez de eu tentar em apenas um query, basta eu criar outros com as ligações, fiz o teste e funcionou, agora vai.

Fico pesado né :

<?php
$colname_rs1 = "-1";
if (isset($_GET['banda_id'])) {
  $colname_rs1 = (get_magic_quotes_gpc()) ? $_GET['banda_id'] : addslashes($_GET['banda_id']);
}
mysql_select_db($database_conexao, $conexao);
$query_rs1 = sprintf("SELECT * FROM banda INNER JOIN estilos ON estilos.estilos_id = banda.estilo_id  WHERE banda.banda_id = %s", $colname_rs1);
$rs1 = mysql_query($query_rs1, $conexao) or die(mysql_error());
$row_rs1 = mysql_fetch_assoc($rs1);
$totalRows_rs1 = mysql_num_rows($rs1);

$maxRows_rs2 = 10;
$pageNum_rs2 = 0;
if (isset($_GET['pageNum_rs2'])) {
  $pageNum_rs2 = $_GET['pageNum_rs2'];
}
$startRow_rs2 = $pageNum_rs2 * $maxRows_rs2;

$colname_rs2 = "-1";
if (isset($_GET['banda_id'])) {
  $colname_rs2 = (get_magic_quotes_gpc()) ? $_GET['banda_id'] : addslashes($_GET['banda_id']);
}
mysql_select_db($database_conexao, $conexao);
$query_rs2 = sprintf("SELECT * FROM integrantes INNER JOIN banda ON integrantes.banda_id = banda.banda_id WHERE banda.banda_id = %s", $colname_rs2);
$query_limit_rs2 = sprintf("%s LIMIT %d, %d", $query_rs2, $startRow_rs2, $maxRows_rs2);
$rs2 = mysql_query($query_limit_rs2, $conexao) or die(mysql_error());
$row_rs2 = mysql_fetch_assoc($rs2);

if (isset($_GET['totalRows_rs2'])) {
  $totalRows_rs2 = $_GET['totalRows_rs2'];
} else {
  $all_rs2 = mysql_query($query_rs2);
  $totalRows_rs2 = mysql_num_rows($all_rs2);
}
$totalPages_rs2 = ceil($totalRows_rs2/$maxRows_rs2)-1;
?>

Mas se funcionou, ta valendo.. vai ficar ainda maior já q vo ter q fazer mais dessas ai.

Editado por Botty
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...