View Full Version : PHP Mysql - Relacionar tabelas


s31s3r
16-03-2008, 12:14
Estou a tentar encontrar ajuda para isto mas está difícil.

http://img172.imageshack.us/img172/2673/tablejm4.png

O que eu queria era criar uma lista com o php, tipo:

Mundo:

foo
Far
VoxPolítica:
barr
CarEstava a tentar utilizar o GROUP BY mas não consigo com que a coisa saia como deve ser.

K0mA
16-03-2008, 12:41
SELECT noticias.nome, sections.nome FROM noticias JOIN sections ON noticias.section_ID = sections.ID (http://dev.mysql.com/doc/refman/5.1/en/join.html)

Funciona?

s31s3r
16-03-2008, 13:11
Ya! Funciona. Pensava que tivesse que utilizar o GROUP BY.
E como é o código PHP para mostrar
Thanks!

AliFromCairo
16-03-2008, 15:42
Para mostrar, só tens que executar a query que foi colocada nesta thread (mysql_connect, ..., mysql_query, ...), e ir guardando num array as entradas para cada secção. Se não quiseres um array auxiliar, podes ordenar os dados pelo nome da secção.

s31s3r
16-03-2008, 16:56
..Se não quiseres um array auxiliar, podes ordenar os dados pelo nome da secção.

Era ordenar por secção que queria fazer, só que isto está difícil, não consigo compreeender...

http://img134.imageshack.us/img134/8897/tableei1.png


$q = "SELECT noticias.nome AS not_nome, sections.nome AS sec_nome
FROM noticias
JOIN sections
ON noticias.section_id = sections.id";

$r = mysql_query($q);

while ($row = mysql_fetch_assoc($r)) {
echo $row["not_nome"].'-->'.$row['sec_nome'].'<br />';
echo '<br />';

}
O que me dá:

foo-->Mundo

barr-->Politica

car-->Politica

far-->Mundo

vox-->Mundo
O que quero fazer é ter o nome da secção no topo, uma só vez seguido dos artigos correspondentes, tipo um sitemap ou um menu...

Serrot
16-03-2008, 20:07
Experimenta algo deste género: (não garanto q não tenha um ou outro erro :winknu:)


$categ= "SELECT * FROM Sections";
$result=mysql_query($categ);
while ($row1 =mysql_fetch_array($result) ) {
echo "<ul>" . $row1['nome'] . "</ul>";
$q = "SELECT noticias.nome AS not_nome, sections.nome AS sec_nome
FROM noticias
JOIN sections
ON noticias.section_id = sections.id
WHERE section_id='" . $row1['ID'] . "'" ;

$r = mysql_query($q);
while ($row = mysql_fetch_assoc($r)) {
echo "<li>" .$row["not_nome"] . '</li>';


}
}

AliFromCairo
16-03-2008, 23:29
Podes usar a cláusula ORDER BY para ordenares os dados pelo nome da secção. Algo do género:


SELECT noticias.nome, sections.nome
FROM noticias JOIN sections ON noticias.section_id = sections.id
ORDER BY sections.nome


Usando a query acima, as linhas vão aparecer ordenadas de acordo com o nome da secção, sendo que apenas necessitas de alterar ligeiramente o teu código, de modo a guardares o último nome da secção que apareceu para não estares a repeti-lo.

Qualquer dúvida coloca aqui.

s31s3r
17-03-2008, 01:45
Ai!
Usei o exemplo do Serrot e estava quase o que queria:


$categ= "SELECT * FROM Sections";
$result=mysql_query($categ);
$i = 0;
while ($s =mysql_fetch_array($result) ) {
$y[$s['nome']] = $s['nome'];

$q = "SELECT noticias.nome AS not_nome, sections.nome AS sec_nome
FROM noticias
JOIN sections
ON noticias.section_id = sections.id
WHERE section_id='" . $s['ID'] . "'" ;

$r = mysql_query($q);

while ($row = mysql_fetch_assoc($r)) {

$x[] = $row['not_nome'];
}

$y[$s['nome']] = $x;
}
O que dá:



Array
(
[Mundo] => Array
(
[0] => foo
[1] => far
[2] => vox
)

[Politica] => Array
(
[0] => foo
[1] => far
[2] => vox
[3] => barr
[4] => car
)

)
Os valores assinalados não deveriam aparecer...

s31s3r
17-03-2008, 03:26
Era um problema com as arrays!


$categ= "SELECT * FROM Sections";
$result=mysql_query($categ);
$i = 0;
while ($s =mysql_fetch_array($result) ) {
//$y[$s['nome']] = $s['nome'];

$q = "SELECT noticias.nome AS not_nome, sections.nome AS sec_nome
FROM noticias
JOIN sections
ON noticias.section_id = sections.id
WHERE section_id='" . $s['ID'] . "'" ;

$r = mysql_query($q);

while ($row = mysql_fetch_assoc($r)) {

$y[$s['nome']][] = $row['not_nome'];

}


}

Array
(
[Mundo] => Array
(
[0] => foo
[1] => far
[2] => vox
)

[Politica] => Array
(
[0] => barr
[1] => car
)

)


Agora só tenho de descobrir o método para extrair isto para uma tpl do smarty...