Sql select join

K0mA

Power Member
Boas,

Não sei se alguém sabe mais ou menos como funciona o wordpress com aquelas funções the_post(), the tile(), get_category() etc.

A minha pergunta é se eu quiser fazer o meu próprio wordpress (PHP+MySQL), quando chegar à altura de mostrar um post vou necessitar de informação de várias tabelas, a questão que se coloca é como fazê-lo...


Supondo que há 3 tabelas (chave estrageira dentro de parêntesis)

  1. POSTS ( id_categoria)
  2. CATEGORIA
  3. COMENTARIOS (id_post)

NOTA o sql apresentado é apenas um esboço...
Opção 1
-----------------------------------------
Fazer um mega select/join:

SELECT * FROM POSTS, CATEGORIA.nome_da_categoria, COMENTARIOS.texto, COMENTARIOS.autor OUTER JOIN CATEGORIA WHERE POST.id_categoria = CATEGORIA.id_categoria OUTER JOIN COMENTARIOS WHERE POST.id_post = COMENTARIO.id_post



Opção 2

-----------------------------------------
Fazer separadamente utilizando funções:

SELECT * FROM POSTS e meter o resultado na função get_posts()

SELECT nome_da_cat FROM CATEGORIAS WHERE CATEGORIAS.id_categoria = POSTS.id_categoria e meter o resultado na função get_cats()

SELECT texto_do_comentario FROM COMENTARIOS WHERE COMENTARIOS.id_post = ... e meter o resultado na função get_posts()



Não sei se me fiz entender, provavelmente isto é uma pergunta sem sentido tendo em conta para que serve um SGBD como o MySql.


Como não tenho experiência com bases de dados queria saber como retirar informação de várias tabelas:
Com uma só query utilizando joins? ou separar mais as coisas...

Se há alguém com experiência em fazer um blog em PHP/MySql que diga de sua justiça.

 
Última edição:
O optimizador do SGBD vai escolher o melhor plano de execução para a tua query, logo não deverás ter que te preocupar em dividir a tua query. Podes também considerar a utilização de views para essas queries que envolvem vários joins.
 
eu recomendo que faças consultas SQL junta, para poderes agrupar os post's por categoria, e, agrupar os comentários por post!

relativamente ao modo de junção, cuidado, porque esse outerjoin.... se reparares um comentário tem que estar associado a um post, logo n pode conter null na chave externa que liga com o post, o post por sua vez pode ter muitos comentários, e um comentário só está relacionado a um post, logo vai ser relação (POST)1 - M (COMENTARIOS) , logo o post n vai conter null's tbm. Logo podes usar uma relação do tipo natural inner join!

Recomendo dares uma olhadela nesses tipos de ligações do SQL.


Cumps
 
Obrigado a todos pelas respostas!
Quanto a tentar fazer tudo numa query e supondo que quero os posts e respectivos comentários.

Trata-se de uma relação 1 para n logo se extrair a informação de duas tabelas, as linhas do posts vão aparecer repetidas caso um post tenha vários comentários...

Código:
[FONT=Courier New]ID_POST     TEXTO_POST     TEXTO_COMENTARIO
--------    ------------   ------------------
1           [COLOR=MediumTurquoise]texto1[/COLOR]...      comentário1_post1
1           [COLOR=MediumTurquoise]texto1[/COLOR]...      comentário2_post1
1           [COLOR=MediumTurquoise]texto1[/COLOR]...      comentário3_post1
2           texto2...      comentário1_post2
3           texto3...      comentário1_post3[/FONT]
Na coluna TEXTO_POST, texto1... vai aparecer repetido tantas vezes quantos os comentários que o post tenha!

Agora se adicionarmos à query as categorias e eventulamente subcategorias, o resultado da query é uma data de linhas repetidas, por isso é que me faz confusão quando dizem para fazer tudo junto e agrupar por posts e por comentários (vai dar uma série de linhas repetidas).

Restaria fazer uma filtragem no loop while( $row = mysql_fetch_assoc($results) ){
No fundo vai-se fazer aqui a separação: comentários para um lado, posts para outro, tendo o cuidado de verificar que os textos são todos distintos ie ignorar o campo TEXTO_POST caso este já exista.

Por isso é que me faz sentido separar, pois qualquer das maneiras vou ter de o fazer!
O que eu gostaria de saber é em termos de programação como é que se costuma fazer, no caso do wordpress eu penso que está tudo separado em funções!

EDIT: de facto o wordpress separa tudo em várias queries:
There’s an extremely useful feature in Wordpress that the more observant of you may have noticed I use. If you look to the bottom of the page, you’ll notice that there’s a line that might read something like:

35 queries. 2.255 seconds
fonte
 
Última edição:
Back
Topo