P3rukao 0 Denunciar post Postado Outubro 25, 2009 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
P3rukao 0 Denunciar post Postado Outubro 25, 2009 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
Eclesiastes 2 Denunciar post Postado Outubro 26, 2009 Pelo que entendi, está faltando adicionar 'n.id' para o seu GROUP BY. Compartilhar este post Link para o post Compartilhar em outros sites
P3rukao 0 Denunciar post Postado Outubro 26, 2009 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
Eclesiastes 2 Denunciar post Postado Outubro 26, 2009 É... 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
P3rukao 0 Denunciar post Postado Outubro 26, 2009 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