• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

vsempre

Como buscar o nome a outra tabela?

22 mensagens neste tópico

Boas pessoal,

Estou outra vez com um pequeno problema. Desde já agradeço a vossa ajuda.

Bem, o problema é o seguinte, tenho uma tabela "clubes" e outra "classificacao".

Na "classificacao" tenho um campo "clube_id" que vai buscar o id do clube. Até aqui, tudo bem, o problema é quando quero visualizar os resultados numa página.

Apenas consigo com que apareça um clube.

Aqui ficam os códigos.

As Querys:

<?php
$colname_rsClassfModa = "-1";
if (isset($_GET['m'])) {
  $colname_rsClassfModa = $_GET['m'];
}
mysql_select_db($database_ligacao, $ligacao);
$query_rsClassfModa = sprintf("SELECT * FROM classificacao WHERE mod_id = %s ORDER BY pontos DESC", GetSQLValueString($colname_rsClassfModa, "int"));
$rsClassfModa = mysql_query($query_rsClassfModa, $ligacao) or die(mysql_error());
$row_rsClassfModa = mysql_fetch_assoc($rsClassfModa);
$totalRows_rsClassfModa = mysql_num_rows($rsClassfModa);

mysql_select_db($database_ligacao, $ligacao);
$query_rsClassClubNome = "SELECT id, nome FROM clubes WHERE id = $row_rsClassfModa[clube_id]";
$rsClassClubNome = mysql_query($query_rsClassClubNome, $ligacao) or die(mysql_error());
$row_rsClassClubNome = mysql_fetch_assoc($rsClassClubNome);
$totalRows_rsClassClubNome = mysql_num_rows($rsClassClubNome);

?>

Mostrando os resultados:

  <?php do { ?>
    <tr>
      <td><?php echo $row_rsClassClubNome['nome']; ?></td>
      <td width="40" align="center"><?php echo $row_rsClassfModa['jogos']; ?></td>
      <td width="40" align="center"><?php echo $row_rsClassfModa['vitorias']; ?></td>
      <td width="40" align="center"><?php echo $row_rsClassfModa['empate']; ?></td>
      <td width="40" align="center"><?php echo $row_rsClassfModa['derrotas']; ?></td>
      <td width="40" align="center"><?php echo $row_rsClassfModa['pontos']; ?></td>
    </tr>
    <?php } while ($row_rsClassfModa = mysql_fetch_assoc($rsClassfModa)); ?>

Desde já agradeço a vossa atenção e ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que não fazes tudo num único select?

SELECT clubes.nome, classificacao.jogos, classificacao.vitorias,
       classificacao.empate, classificacao.derrotas, classificacao.pontos
FROM classificacao INNER JOIN clubes ON classificacao.clube_id = clubes.id
WHERE classificacao.mod_id = <USERINPUT>
ORDER BY classificacao.pontos DESC

Atenção: select não testado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas pmg,

Antes de mais, obrigado pela ajuda.

Já testei o teu select no phpmyadmin e funciona, no entanto no browser não me aparece o nome do clube.

Estou a usar o seguinte echo:

<?php echo $row_rsClassfModa['clubes.nome']; ?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta

<?php echo $row_rsClassfModa['nome']; ?>

ou então dá nomes 'simples' às colunas resultantes do select

SELECT clubes.nome AS nome, classificacao.jogos AS jogos, classificacao.vitorias AS vitorias,
       classificacao.empate AS empate, classificacao.derrotas AS derrotas, classificacao.pontos AS pontos
FROM ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm.. no INNER JOIN posso ir buscar dois dados diferentes à mesma tabela.

Já andei a pesquisar e apenas encontro exemplos para apenas um dado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

huh sim podes meter clubes.campo1, clubes.campo2, clubes.campo3...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é bem isso que pretendo.

Vou deixar aqui o código que pretendo utilizar, embora não esteja a funcionar.

SELECT clubes.nome, calendario.clube_casa, calendario.clube_fora, calendario.data FROM calendario INNER JOIN clubes ON calendario.clube_casa = clubes.id, calendario.clube_fora = clubes.id WHERE mod_id = 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas eu não quero que isso seja uma condição.

A ideia é obter os nomes dos clubes da modalidade X, neste caso, o nome do clube que joga em casa e o nome do clube que joga fora.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então faz um select às duas tabelas

SELECT t1.campo,t2.campo FROM t1,t2 WHERE t1.campo=t2.campo AND t1.campo2=t2.campo4

não sei se com RIGHT OUTER JOIN vai lá com a base de dados que tens.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, acho que não me estou a expressar da melhor forma, por isso o melhor é mesmo colocar aqui o código.

A Query:

<?php
$colname_rsCalenMod = "-1";
if (isset($_GET['m'])) {
  $colname_rsCalenMod = $_GET['m'];
}
mysql_select_db($database_ligacao, $ligacao);
$query_rsCalenMod = sprintf("SELECT clubes.nome, calendario.clube_casa, calendario.clube_fora, calendario.data FROM calendario INNER JOIN clubes ON calendario.clube_casa = clubes_id,calendario.clube_fora = clubes.id  WHERE mod_id = %s ORDER BY `data` DESC", GetSQLValueString($colname_rsCalenMod, "int"));
$rsCalenMod = mysql_query($query_rsCalenMod, $ligacao) or die(mysql_error());
$row_rsCalenMod = mysql_fetch_assoc($rsCalenMod);
$totalRows_rsCalenMod = mysql_num_rows($rsCalenMod);
?>

Mostrando os resultados:

  <?php do { ?>
    <tr>
      <td align="center"><?php echo $row_rsCalenMod['nome']; ?></td>
      <td align="center">x</td>
      <td align="center"><?php echo $row_rsCalenMod['nome']; ?></td>
      <td align="center"><?php echo $row_rsCalenMod['data']; ?></td>
    </tr>
    <?php } while ($row_rsCalenMod = mysql_fetch_assoc($rsCalenMod)); ?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que queres os nomes dos dois clubes que vão jogar, certo?

Faz assim (pseudo-código)

select ...
from calendario, clubes casa, clubes visitante
where calendario.clube_casa = casa.id and calendario.clube_fora = visitante.id
and ...
order by ...

Eu não sei escrever INNER JOINS com o formato que 'toda a gente' usa.

O que eu pus ali em cima no where, seria feito por 'toda a gente' com "INNER JOIN"

O que o meu select faz é o seguinte:

No FROM estão três tabelas, duas das quais são a mesma e por isso mesmo, para as distinguir, dou-lhes outro nome.

Depois no WHERE ligo a tabela calendario à tabela casa (um INNER JOIN) e ligo também à tabela visitante (outro INNER JOIN), mas como não sei escrever INNER JOINs faço as ligações com o WHERE.

No resto das condições do WHERE metes os limites que precisas.

EDIT

select ... casa.nome, visitante.nome, ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Não percebi bem o teu select, fiz o seguinte, não me dá erro, mas também não me dá resultados ;)

SELECT * from calendario, clubes
where calendario.clube_casa = clubes.id and calendario.clube_fora = clubes.id AND mod_id = 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é que queres dizer com "não me dá resultados"?

Experimentaste o select no phpmyadmin?

O que é que acontece se tirares a última parte?

SELECT * FROM calendario, clubes
WHERE calendario.clube_casa = clubes.id AND calendario.clube_fora = clubes.id

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

O que quero dizer é isto:

MySQL não retornou nenhum registo. (O Query demorou 0.0190 sec)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra a estrutura das tuas tabelas 'calendario', 'classificacao' e 'clubes'.

Executa os comandos seguintes no phpmyadmin:

DESCRIBE calendario;
DESCRIBE classificacao;
DESCRIBE clubes;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Executando esses comandos obtenho:

DESCRIBE calendario;# Registos: 6

DESCRIBE classificacao;# Registos: 9

DESCRIBE clubes;# Registos: 4

Mas penso que queres é saber isto:

calendario:

`calendario` (

  `id` int(11) NOT NULL auto_increment,

  `mod_id` int(11) NOT NULL,

  `ep_id` int(11) NOT NULL,

  `clube_casa` int(11) NOT NULL,

  `clube_fora` int(11) NOT NULL,

  `data` date NOT NULL,

  PRIMARY KEY  (`id`)

)

classificacao:

`classificacao`

(

  `id` int(11) NOT NULL auto_increment,

  `mod_id` int(11) NOT NULL,

  `ep_id` int(11) NOT NULL,

  `clube_id` int(11) NOT NULL,

  `jogos` int(11) NOT NULL,

  `vitorias` int(11) NOT NULL,

  `empate` int(11) NOT NULL,

  `derrotas` int(11) NOT NULL,

  `pontos` int(11) NOT NULL,

  PRIMARY KEY  (`id`)

)

clubes:

`clubes` (

  `id` int(11) NOT NULL auto_increment,

  `nome` varchar(255) NOT NULL,

  `logotipo` varchar(255) NOT NULL,

  `infos` text,

  PRIMARY KEY  (`id`)

)

Atenção: A minha dúvida no primeiro post (classificacao), a mesma já está resolvida. Falta-me agora é no "calendario"

Obrigado pela ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, era isso que eu queria ;)

O select seguinte funciona? Isto é: devolve o nome do clube que vai jogar em casa para cada `id` do calendário?

SELECT calendario.id, calendario.data, clubes.nome AS ClubeCasa
FROM calendario, clubes
WHERE calendario.clube_casa = clubes.id

E este diz quem vai jogar fora?

SELECT calendario.id, calendario.data, clubes.nome AS ClubeFora
FROM calendario, clubes
WHERE calendario.clube_fora = clubes.id

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E este não 'funciona'?

SELECT calendario.id, calendario.data, casa.nome AS ClubeCasa, visitante.nome AS ClubeFora
FROM calendario, clubes casa, clubes visitante
WHERE calendario.clube_casa = casa.id AND calendario.clube_fora = visitante.id

Este select é o "mesmo" que eu pus aqui ontem, em pseudo-código!

Se não funciona qual é o erro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora