Array
(
)

Ajuda com selects, whiles e afins

PHP
Alessandra
   - 26 out 2013

ola sou novata (vai dar pra ver..rs) e to quebrando a cabeça pra criar um sistema assim ...
quero mostrar um post/noticia, com categoria e sub categorias .. por exemplo
noticia 01 (titulo) , essa é a noticia 01 (texto) internet (categoria) google, facebook, orkut (subcategorias)
noticia 02 (titulo) , essa é a noticia 02 (texto) receitas (categoria) pão, molho, sobremesa (subcategorias)
tenho 3 tabelas no mysql que sao
noticias
categorias
subcategorias
agora o problema ta que nao sei como linkar uma na outra sabe
tipo ja tentei de n maneiras, mais oque mais consegui fazer foi aparecer todas as categorias e as subcategorias, sera que algum anjo poderia me ensinar ?
meu skype alessandraferrarini@hotmail.com

Joel Rodrigues
   - 26 out 2013

Nesse caso você possui dois tipos de relacionamentos:
Noticias X Categorias: 1 para muitos
Noticias X Subcategorias: muitos para muitos

É preciso que cada uma tenha pelo menos um campo identificador, ou seja, uma chave primária. Com isso é possível relacioná-las, formando tabelas auxiliares.

Por exemplo, em uma estrutura bem simples poderia ficar assim:

Tabela Noticias
- ID_Noticia
- Titulo
- Texto
- ID_Categoria (chave estrangeira que aponta para a chave primária da tabela Categorias)

Tabela Noticias_Subcategorias
- ID_Noticia (chave estrangeira que aponta para a chave primaria da tabela Noticias)
- ID_Subcategoria (chave estrangeira que aponta par a chave primária da tabela Subcategorias)

Neste exemplo eu não me preocupei com a estrutura das tabelas Categorias e Subcategorias, pois o importante é que elas tenham uma chave primária.

Joel Rodrigues
   - 26 out 2013

Para facilitar, poste aqui a estrutura das suas tabelas (colunas de cada uma).

Alessandra
   - 28 out 2013

Oi joel bom dia ...
entao eu tenho as tabelas mais ou menos como voce falou..

Tabela Noticias
idNot
Titulo
Categoria(chave estrangeira da tabela Noticias - idCat)
subcategoria (chave estrangeira para tabela subCategoria)

Tabela Categoria
idCat
nomeCat
idSub

Tabela subCategoria
idSub
nomeSub
idNot

Eu nao consigo fazer o select pra pegar a noticia, com sua categoria e as varias subcategorias ...
Se puder me dar uma luz agradeço muitooooooo

Alessandra
   - 08 nov 2013

entao só revivendo o topico pois ainda não consegui fazer.
tenho as tres tabelas http://4.bp.blogspot.com/-QxPm5P1t2dk/Un0N8a_MVVI/AAAAAAAAHjQ/L_CwLNBV3kQ/s1600/tabelas.PNG

dai tenho o codigo:

Citação:

$link = @mysql_connect('localhost' , 'root' , '');

if(!$link)
die($mysql_error);

// No SQL, o BD tá com nome de imasters
$db = mysql_select_db('alessandra');

$sql = '
SELECT
noticias.idNot,
noticias.subcategorias,
noticias.titulo,
notsub.subcategoria,
subcategorias.idSub,
subcategorias.nomeSub
FROM
noticias
INNER JOIN notsub ON noticias.subcategorias = notsub.notId
INNER JOIN subcategorias ON notsub.subcategoria = subcategorias.idSub

' ;

$query = mysql_query($sql);

while($linha = mysql_fetch_array($query)){
echo "
(Id Noticia:){$linha['idNot']}</br>
(titulo){$linha['titulo']}</br>
(titulo){$linha['nomeSub']}</br></br>
</hr>";

}



So que ele ta mostrando assim:

Citação:
(Id Noticia:)1
(titulo)titulo 01
(titulo)facebook

(Id Noticia:)2
(titulo)tiulo 02
(titulo)facebook

(Id Noticia:)1
(titulo)titulo 01
(titulo)google

(Id Noticia:)1
(titulo)titulo 01
(titulo)orkut


eu queria que ele mostrasse
titulo 01, facebok, google , orkut

titulo 2, facebook

Alguem da um help?

Joel Rodrigues
   - 08 nov 2013

Olá, Alessandra. Desculpe não ter respondido antes, é que são tantos tópicos que acabei não vendo quando você respondeu.

Em um único select você consegue trazer os dados da notícia e da categoria, já que o relacionamento é de 1 para 1. Porém, não dá para trazer todas as subcategorias no mesmo select, pois o relacionamento é de 1 para N. Se você precisa ver todas as subcategorias de uma notícia, terá que fazer um select separado, filtrando a tabela auxiliar, por exemplo:
#Código

SELECT
	subcategorias.nomeSub
FROM
	subcategorias
	INNER JOIN notsub ON notsub.subcategoria = sucategorias.idSub
WHERE
	notsub.notId = "O ID DA NOTÍCIA QUE VOCÊ QUER"

Isso traria só os nomes das subcategorias (uma por linha) às quais pertence uma certa notícia.

Alessandra
   - 08 nov 2013

Entao mais é tipo na pagina principal eu queria que listasse todas as noticias entendeu , e essas subcategorias seriam tipo tags ou marcadores..

Voce acha que tendo essas 3 tabelas é o correto ?

Joel Rodrigues
   - 08 nov 2013

Perfeitamente, foi até o que eu sugeri também. As tabelas estão corretas, o que não dá é pra trazer as subcategorias no mesmo select que os dados da notícia. Você terá que trazê-las separadamente. Ou seja, para cada notícia, precisa de um select para ver as subcategorias. Até porque eu acho que você vai querer fazer um link em cada subcategoria, para listar as demais notícias de cada uma. Para isso, você vai precisar também do id de cada subcategoria.

Alessandra
   - 08 nov 2013

isooo mesmo , bem isso , mais assim se nao for pedir demais tem como voce postar o codigo pronto ?
De repente da pra aproveitar isso que ja fiz , sera que consegue me ajudar ?

(nao me mande pra aquele lugar !!!!1 )

Joel Rodrigues
   - 08 nov 2013

Façamos assim: crie o código para listar apenas a notícia com a categoria e poste aqui. Ah, use as tags CODE.
Aí eu tento complementar com as subcategorias.

Alessandra
   - 08 nov 2013

è que a categoria nao tem muito problema pq categoria mesmo so vai ter uma, por isso nem coloquei o codigo, o problema ta em listas as varias subcategorias, que no caso tb estarei usando como tags, mais de qualquer jeito fiz assim

#Código

<?php 
$link = @mysql_connect('localhost' , 'root' , '');

if(!$link)
die($mysql_error);

// No SQL, o BD tá com nome de imasters
$db = mysql_select_db('alessandra');

$sql = '
SELECT
noticias.idNot,
noticias.titulo,
noticias.categorias,
noticias.subcategorias,
categorias.idCat,
categorias.nomeCat,
notsub.notId,
notsub.subcategoria,
subcategorias.idSub,
subcategorias.nomeSub
FROM
noticias
INNER JOIN categorias ON noticias.categorias = categorias.idCat
INNER JOIN notsub ON noticias.subcategorias = notsub.notId
INNER JOIN subcategorias ON notsub.subcategoria = subcategorias.idSub
ORDER BY
noticias.titulo ASC
' ;

$query = mysql_query($sql);

while($linha = mysql_fetch_array($query)){
echo "
(Id Noticia:){$linha['idNot']}</br>
(titulo){$linha['titulo']}</br>
(Categoria){$linha['nomeCat']}</br>
(Subcategoria){$linha['nomeSub']}</br></br>
</hr>";

}

?>


Nisso ta retornando dessa maneira:
(Id Noticia:)1
(titulo)titulo 01
(Categoria)internet
(Subcategoria)google

(Id Noticia:)1
(titulo)titulo 01
(Categoria)internet
(Subcategoria)facebook

(Id Noticia:)1
(titulo)titulo 01
(Categoria)internet
(Subcategoria)orkut

(Id Noticia:)2
(titulo)tiulo 02
(Categoria)receitas
(Subcategoria)facebook

e eu queria assim

(Id Noticia:)1
(titulo)titulo 01
(Categoria)internet
(Subcategoria)orkut, facebook, google

(Id Noticia:)2
(titulo)tiulo 02
(Categoria)receitas
(Subcategoria)facebook (ela so tem uma subcategoria mesmo)

Joel Rodrigues
   - 08 nov 2013

Então, faça como eu pedi. Liste só a notícia com a categoria e deixe as subcategorias para depois. É aí que eu vou "entrar" para ajudar.

Alessandra
   - 08 nov 2013

#Código

<?php 
$link = @mysql_connect('localhost' , 'root' , '');

if(!$link)
die($mysql_error);


$db = mysql_select_db('alessandra');

$sql = '
SELECT
noticias.idNot,
noticias.titulo,
noticias.categorias,
categorias.idCat,
categorias.nomeCat
FROM
noticias
INNER JOIN categorias ON noticias.categorias = categorias.idCat

' ;

$query = mysql_query($sql);

while($linha = mysql_fetch_array($query)){
echo "
(Id Noticia:){$linha['idNot']}</br>
(titulo){$linha['titulo']}</br>
(Categoria){$linha['nomeCat']}</br>
(Subcategoria)</br></br>
</hr>";

}

?>


(Id Noticia:)1
(titulo)titulo 01
(Categoria)internet
(Subcategoria)

(Id Noticia:)2
(titulo)tiulo 02
(Categoria)receitas
(Subcategoria)

Joel Rodrigues
   - 10 nov 2013

Não tenho como testar aqui, mas dentro desse while que você já tem, você precisará fazer outro select para listar só as subcategorias. Então, depois desse echo que imprime a notícia, você vai precisar inserir algo como o seguinte trecho de código:
#Código

$sqlSubcategorias = '
SELECT idSub, nomeSub
FROM subcateorias
INNER JOIN notsub on notsub.subcategoria = subcategorias.idSub
WHERE notsub.notId ='.$linha['idNot'];

$querySubcategorias = mysql_query($querySubcategorias);

while($linhaSubcategoria = mysql_fetch_array($query)){
	echo $linhaSubcategoria['nomeSub'];
}


Deve precisar de alguma adaptação, mas creio que a base seja essa.