::Porto 0 Denunciar post Postado Janeiro 11, 2007 Pessoal, como resolver a seguinte situação: Vamos supor as 2 tabelas: ------------------- LIVROS -----------------------ID LIVRO EDICAO PAGINAS EDITORA1 livro01 2a 200 Atica2 livro02 3a 320 Saraiva3 livro03 1a 403 Saraiva4 livro04 1a 320 Atica5 livro05 3a 350 Atica6 livro06 1a 203 Saraiva---------------- CATEGORIA ---------------------IDP ID CATEGORIA PRECO DATA1 2 usado 55,00 2007-01-01 03:00:002 1 novo 45,00 2007-01-01 04:00:003 1 novo 50,00 2007-01-01 05:00:004 1 usado 65,00 2007-01-01 06:00:005 6 usado 40,00 2007-01-01 07:00:006 5 novo 40,00 2007-01-01 08:00:007 3 novo 50,00 2007-01-01 09:00:008 5 usado 45,00 2007-01-01 10:00:00Quero construir uma query que me forneça os 3 primeiros dados ordenados decrescentemente pela DATA e com IDs distintos, ou seja, o resultado ideal seria este: ID LIVRO PRECO DATA5 livro05 45,00 2007-01-03 10:00:003 livro03 50,00 2007-01-01 09:00:006 livro06 40,00 2007-01-04 07:00:00Alguém poderia ajudar? Obrigado. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
cassitos 2 Denunciar post Postado Janeiro 13, 2007 Olá! Utilizei o mysql 5.0.24, você pode utilizar com qualquer versão 5.x, para fazer alguns testes com sua situação. Tabelas criadas: CREATE TABLE `livros` ( `ID` int(11) NOT NULL auto_increment, `LIVRO` varchar(150) default NULL, `EDICAO` varchar(10) default NULL, `PAGINAS` int(6) default NULL, `EDITORA` varchar(60) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM CREATE TABLE `categoria` ( `IDP` int(11) NOT NULL auto_increment, `ID` int(11) NOT NULL, `CATEGORIA` varchar(20) default NULL, `PRECO` double(13,2) default NULL, `DATA` datetime default NULL, PRIMARY KEY (`IDP`) ) ENGINE=MyISAM registros de cada tabela: insert into `livros` (`ID`,`LIVRO`,`EDICAO`,`PAGINAS`,`EDITORA`) values (1,'livro01','2a',300,'Atica'); insert into `livros` (`ID`,`LIVRO`,`EDICAO`,`PAGINAS`,`EDITORA`) values (2,'livro02','3a',320,'Saraiva'); insert into `livros` (`ID`,`LIVRO`,`EDICAO`,`PAGINAS`,`EDITORA`) values (3,'livro03','1a',403,'Saraiva'); insert into `livros` (`ID`,`LIVRO`,`EDICAO`,`PAGINAS`,`EDITORA`) values (4,'livro04','1a',320,'Atica'); insert into `livros` (`ID`,`LIVRO`,`EDICAO`,`PAGINAS`,`EDITORA`) values (5,'livro05','3a',350,'Atica'); insert into `livros` (`ID`,`LIVRO`,`EDICAO`,`PAGINAS`,`EDITORA`) values (6,'livro06','1a',203,'Saraiva'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (1,2,'usado',55.00,'2007-01-01 03:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (2,1,'novo',45.00,'2007-01-01 04:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (3,1,'novo',50.00,'2007-01-01 05:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (4,1,'usado',65.00,'2007-01-01 06:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (5,6,'usado',40.00,'2007-01-01 10:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (6,5,'novo',40.00,'2007-01-01 08:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (7,3,'novo',50.00,'2007-01-02 09:00:00'); insert into `categoria` (`IDP`,`ID`,`CATEGORIA`,`PRECO`,`DATA`) values (8,5,'usado',45.00,'2007-01-03 10:00:00'); A query utilizada (está comentado): SELECT A.ID, A.LIVRO, B.PRECO, B.DATA FROM livros A INNER JOIN categoria B ON B.ID = A.ID /*Até aqui uma consulta normal, "ligando" o livro (com o Alias A) com a categoria (com Alias B )*/ WHERE /* Aqui o código da categoria (tabela B ) será igual ao código da categoria mais recente do livro (na subquery abaixo, tabela C) */ /* Selecionar o código da categoria (C.IDP), consultando o registro mais recente do livro (C.ID = B.ID), retornando apenas o primeiro mais recente do livro */ B.IDP = (SELECT C.IDP FROM categoria C WHERE C.ID = B.ID ORDER BY C.DATA DESC LIMIT 1) /*Por fim, será ordenado pela data decrescentemente (geral), baseando-se na categoria mais recente de cada livro, limitando o resultado geral a 3 registros*/ ORDER BY B.DATA DESC LIMIT 3 O resultado foi o seguinte: ID LIVRO PRECO DATA5 livro05 45.00 2007-01-03 10:00:003 livro03 50.00 2007-01-02 09:00:006 livro06 40.00 2007-01-01 10:00:00Ali no seu exemplo confundiu um pouco na hora, pq os registros informados na tabela categoria não conferem com o resultado ideal.Tente reproduzir o que te passei e veja se é o que está precisando. Se tiver algum problema avisa ae, beleza? Aqui está a referencia no manual do mysql sobre subquery. Compartilhar este post Link para o post Compartilhar em outros sites
::Porto 0 Denunciar post Postado Janeiro 14, 2007 Cassitos,Ficou perfeito!!! Fiquei uns 3 dias tentando resolver este SELECT e nada de encontrar uma solução... já estava desanimando. Vou ver se estudo um pouco sobre subquery porque realmente irei precisar. Valeu mesmo.. de verdade.. pelas explicações e boa vontade para ajudar. Um abraço. Compartilhar este post Link para o post Compartilhar em outros sites
cassitos 2 Denunciar post Postado Janeiro 14, 2007 beleza! qquer coisa estamos ae. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites