Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

P3rukao

[Resolvido] Selecionar dados com JOIN sem repetir nenhuma das col

Recommended Posts

Daew pessoal...

Eu tenho uma tabela de notícias que tem um relacionamento de Muitos-pra-Muitos com a tabela de categorias de noticias...

 

Nesse caso está assim:

-> 3 tabelas;

-> Tabela noticias: id, titulo, chamada, etc...

-> Tabela categorias: id, titulo;

-> Tabela noticias_categorias: noticia_id, categoria_id;

 

Estou puxando todos os dados de uma só vez usando o JOIN:

 

SELECT n.id AS nid, n.titulo AS nt, n.chamada AS nc, n.data_criacao AS nd, c.id AS cid, c.titulo AS ct 
FROM noticias AS n 
JOIN noticias_categorias AS nc ON (n.id = nc.noticia_id) 
JOIN categorianoticias AS c ON (c.id = nc.categorianoticia_id) 
GROUP BY cid DESC 
LIMIT 9

nid _______ nt ____________________ nc ______________________________________ nd __________ cid ________ ct

1 _____ teste de titulo num1 ____ <p>teste de chamada num1</p> ________ 2009-10-22 19:04:22 ____ 8 ________ praça

1 _____ teste de titulo num1 ____ <p>teste de chamada num1</p> ________ 2009-10-22 19:04:22 ____ 7 ________ mercado

1 _____ teste de titulo num1 ____ <p>teste de chamada num1</p> _________ 2009-10-22 19:04:22 ____ 6 ________ preto

4 _____ sdfs ___________________ <p>dsfsdf</p> ______________________ 2009-10-22 20:39:09 ____ 5 ________ branco

1 _____ teste de titulo num1 ____ <p>teste de chamada num1</p> _________ 2009-10-22 19:04:22 ____ 4 ________ azul

 

 

Da forma como está, eu consegui fazer com que ele não repetisse as categorias, exibindo somente aquelas que estão relacionadas com as notícias e sem repetir o ID; Porém ele repete a notícia... =/

 

Já tentei usar o SELECT DISTINCT porem esse comando só funciona se eu informar somente os dados de UMA tabela (noticias por exemplo)... e ao tentar selecionar os dados da tabela de categorias ele para de funcionar;

 

 

O que estou querendo fazer é o seguinte:

Uma listagem das ultimas noticias cadastradas divididas por categorias... nesse caso, apareceria somente UMA de cada categoria cadastrada que estivesse ligada com uma notícia ao menos... e essa notícia não poderia se repetir na listagem também...

 

Eu tentei usar o GROUP_CONCAT() também... para ver se funcionava, e ele mostra as outras noticias q estão relacionadas as categorias também... porém não sei como filtrar para não repetir essa bendita notícia:

 

 

nid ____________ nt _______________________________________________ nc ___________________________ nd ________________ cid ________ ct

1 _______ teste de titulo num1 __________________________ <p>teste de chamada num1</p> _______ 2009-10-22 19:04:22 _______ 8 _______ praça

1 _______ teste de titulo num1 __________________________ <p>teste de chamada num1</p> _______ 2009-10-22 19:04:22 _______ 7 _______ mercado

3 _______ teste de titulo de album,teste de titulo num1 _______ <p>tste</p> _______________________2009-10-22 20:36:01 _______ 6 _______ preto

4 _______ sdfs,dfgd ___________________________________ <p>dsfsdf</p> ______________________2009-10-22 20:39:09 _______ 5 _______ branco

1 _______ teste de titulo num1,dsfsd,sdfs,rer _______________ <p>teste de chamada num1</p> _______ 2009-10-22 19:04:22 _______4 _______ azul

 

 

 

->Alguém sabe como fazer essa consulta??

Compartilhar este post


Link para o post
Compartilhar em outros sites

E testando aqui... eu vi que ele não está listando corretamente os dados...

Eu alterei aqui, para que as notícias só tenham uma categoria apenas na hora do cadastro... mas a estrutura das tabelas continua igual...

 

Mas está acontecendo assim: Se eu adiciono uma nova noticia com uma das categorias já registradas... ela não aparece na lista das ultimas que foram postadas...

 

 

 

-> O que que está errado no código?

-> Como eu faço pra listar sempre a ultima de cada categoria postada???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já havia tentado isso também... mas daí ele passa a repetir as categorias...

 

Pelos meus testes: sempre que eu adiciono uma nova noticia com uma categoria nova também... daí ele aparece no topo da lista... mas se eu adicionar outra noticia com essa mesma categoria cadastrada recentemente, ele não aparece na lista...

 

Repetindo o comando SELECT acima e trocando o GROUP BY por ORDER BY ele passa a mostrar os ultimos resultados porém repetindo as categorias...

 

 

Estou tentando com o JOIN pois vi que ao usar muitos Selects aninhados o numero de consultas ao banco passa a ser enorme... e como eh um sistema de noticias, ele precisa ser bem construido... =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

É... agora acho que compreendi a situação. Veja se esta lhe ajuda:

 

SELECT x.*
  FROM (
    SELECT n.id AS nid,
           n.titulo AS nt,
           n.chamada AS nc,
           n.data_criacao AS nd,
           c.id AS cid,
           c.titulo AS ct 
      FROM noticias AS n 
        JOIN noticias_categorias AS nc
          ON (n.id = nc.noticia_id) 
        JOIN categorianoticias AS c
          ON (c.id = nc.categorianoticia_id) 
      GROUP BY n.id DESC
      LIMIT 100
  ) x
  GROUP BY x.cid
  LIMIT 9 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caramba deu certinho...:D

Agora ele está listando corretamente... do jeito que eu estava imaginando.

Eu ainda não tinha visto essa forma de selecionar os dados... vou ter que dar uma analisada com calma pra pegar o "macete"... ;)

 

Mas vlw aew Eclesiastes, tu salvou meu dia...http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.