Ir para conteúdo

POWERED BY:

Arquivado

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

::Porto

Como construir esta query?

Recommended Posts

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:00
Quero 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:00
Algué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

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:00
Ali 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

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

×

Informação importante

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