Ir para conteúdo
Daniel_Ribeiro

essa aqui eu torrei neuronios

Recommended Posts

Pessoal, ja passei mais de 4 horas aqui e nao consigo resolver umaquery. Eu tenho uma tabela de pedidos, e eu preciso de uma query queme retorne todos os ultimos pedidos do cliente registrados nela.A base de dados e Mysql 5. Para referencia, estou mandando uma versaolight da estrutura da tabela e alguns dados para entenderem melhor:CREATE TABLE `pedidos` ( `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `id_cliente` INT( 10 ) UNSIGNED NOT NULL , `valor` DECIMAL( 10, 2 ) UNSIGNED NOT NULL , `data` DATE NOT NULL) ENGINE = MYISAM ;Inseri uns dados de exemplo na tabelaINSERT INTO `pedidos` ( `id` , `id_cliente` , `valor` , `data` )VALUES (NULL , '2', '4.12', '2006-10-06'), (NULL , '1', '5.72', '2006-10-06'), (NULL , '1', '10.57', '2006-10-08'), (NULL , '2', '9.14', '2006-10-08');Bom, entao vimos que na tabela temos 2 pedidos do cliente 1 e 2pedidos do cliente 2, o que eu quero e uma query que me retorne osdados somente do ultimo pedido do cliente. e nao de todos os pedidos.Usei algo do tipoSELECT pedidos. *FROM pedidosGROUP BY id_clienteORDER BY dataMas nao funcinou, ja tentei varias combinacoes com GROUP BY, HAVING,MIN, e nenhuma obtive sucesso. Aparentemente deveria ser algo simples,mas isso ja me torrou alguns neuronios e eu nao to conseguindoenchergar uma solucao pra esse resultado. Apos muitas tentativas,resolvi apelar aqui pra lista pra ver se alguem ja passou por algumproblema semelhante ou algum "SQL-MASTER" consiga me ajudar.Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

você pode utilizar o Limit p/ definir a quantidade de registros no resultado, ex:

SELECT pedidos. *

FROM pedidos

GROUP BY id_cliente

ORDER BY data

LIMIT 1

Bom, o problema é que somente 1 registro será exibido independente do cliente sacou?

Agora, se é p/ exibir somente 1 registro por cliente nesta mesma consulta e este Group By combinado com a ordenação pela data não está retornando o registro que deveria... então...

Tente com SubQuery:

SELECT *

FROM pedidos A

WHERE

A.id = (SELECT B.id FROM pedidos B WHERE B.id_cliente = A.id_cliente ORDER BY data DESC LIMIT 1)

Acho que ficou meio marretado mas pelo teste aqui retornou.

Já tive um problema parecido com o seu, mesmo utilizando Group By e ordenando pelo campo que precisava, não era o resultado que deveria exibir.

Mas na época nem imaginava que existia subquery, daí tive que fazer no braço lá no programa msm ehehehe

Manual do MySQL - SubQuery aqui

To chapado de sono, v c te ajuda em algo ae, qquer coisa só postar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valew cara. Era isso mesmo que eu precisava.Na verdade eu ate imaginava que deveria usar subquery, porem nao conhecia que podia usar como referencia na subquery dados da query principal, como da forma que foi feita, usando aliases para as tabelas.Mais uma que aprendi. Muito obrigado mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só por favor use Engine=InnoDb ;D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Daniel tenho um problema parecido porem nao consegui solução estrutura

 

Tabela agenda (campos)

 

age_id (pk) |sub_id (fk)

 

Tabela Subcategoria

sub_id (pk) |sigla

 

Dados

 

Tabela Agenda

age_id | sub_id

1 1

2 1

3 2

4 2

5 3

 

Tabela Subcategoria

sub_id (PK) sigla

1 | MT

2| ST

3| NT

 

preciso do ultimo evento de cada categoria na mesma sql o resultado da consulta seria

 

Tabela Resultado

age_id, sub_id | sigla

2 | 1 MT

4 | 2 ST

5 | 3 NT

 

pode me ajudar? não consigo retornar o ultimo registro de agenda por cada subcategoria

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

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