Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Lógica correta? Joins?


Botty

Question

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 to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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.

Edited by Botty
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...