Jump to content
Sign in to follow this  
notax

Consulta MySQL com limit e grup by

Recommended Posts

Pessoal, bom dia!

 

Tenho uma consulta por ASP a um bd mysql que tá me quebrando a cabeça...

 

O que ocorre é que nessa tabela tem os seguintes campos:

 

serial, data, hora

 

Preciso mostrar apenas o registro mais atual de cada serial, mas considerando todos os seriais na mesma consulta...

 

O que fiz foi:

 

sql = "select * from minhatabela order by data desc, hora desc limit 1"

 

O que ocorre é que ele mostra apenas um registro na consulta... ou seja, apenas de uma serial... e eu precisava que ele mostrasse os últimos inseridos de todas seriais...

 

Onde está meu erro?

 

IMPORTANTE: postei apenas um trecho da consulta, visto que na consulta real existem outros comparativos com outras tabelas...

 

Valews

Share this post


Link to post
Share on other sites

Testou assim ?

select * from tabela order by data desc group by hora limit 0,1

Não testei a query, pois estou sem o mysql query browser neste micro, mas acho que seria mais ou menos assim a query

 

Testei agora, a query ficou assim:

select * from tabela group by hora order by data desc limit 0,1

 

Note que com o limit em 0,1 ele só irá retornar 1 registro, que no caso é o mais recente.

Edited by Vinicius Ianni

Share this post


Link to post
Share on other sites

Obrigado pelo retorno, estava fazendo vários testes...

 

Olha só, se eu tivesse usando access bastaria eu fazer algo do tipo:

sql = "select top 1 codigo from minha_tabela where condicao1 = '"&condicional1&"' order by codigo desc"

 

Ou seja, como o campo código é autonumerico nesse recordset eu teria todos os últimos registros que entraram na tabela e obedecerem a condicional1...

 

Se eu tento fazer isso em mysql não dá certo... mesmo que eu coloque desta forma:

 

sql = "select codigo from minha_tabela where condicao1 = '"&condicional1&"' order by codigo desc limit 1"

 

O que acontece no mysql é que ele colocará o primeiro registro que ele encontre e obedeça a condicional, e não necessáriamente na ordem que eu gostaria, ex. o de maior código, ou seja, o último entrante...

 

Sacaram?

 

Alguém sabe onde estou errando?

Share this post


Link to post
Share on other sites

para que eu entenda melhor...voce só vai mostrar o ultimo serial cadastrado comparando a data e hora?

 

se for tente:

 

select * from tabela group by data,hora desc order by id desc limit 1

 

Espero ter ajudado

Share this post


Link to post
Share on other sites

Uhm... assim, o que eu tenho é a tabela da seguinte forma:

 

codigo | serial | data_hora | texto | condicao

 

Nessa tabela posso ter vários registros de várias seriais iguais exemplo:

 

1 | s123 | 2011-07-10 13:15:10 | bla bla bla a | condicao2

2 | s123 | 2011-07-10 13:16:10 | bla bla bla b | condicao2

3 | s123 | 2011-07-10 13:17:10 | bla bla bla c | condicao1

4 | s356 | 2011-07-10 13:18:10 | bla bla bla d | condicao1

5 | s356 | 2011-07-10 13:19:10 | bla bla bla e | condicao2

6 | s356 | 2011-07-10 13:20:10 | bla bla bla f | condicao2

7 | s356 | 2011-07-10 13:21:10 | bla bla bla g | condicao1

 

 

 

Quero uma consulta que me mostre apenas os registros onde condicao seja = condicao2 e que tenham a maior data, pegando apenas uma serial... no caso acima os registros que eu queria são apenas:

 

2 | s123 | 2011-07-10 13:16:10 | bla bla bla b | condicao2

6 | s356 | 2011-07-10 13:20:10 | bla bla bla f | condicao2

 

Sacaram?

 

 

Como devo fazer isso?

Share this post


Link to post
Share on other sites

Uhm... assim, o que eu tenho é a tabela da seguinte forma:

 

codigo | serial | data_hora | texto | condicao

 

Nessa tabela posso ter vários registros de várias seriais iguais exemplo:

 

1 | s123 | 2011-07-10 13:15:10 | bla bla bla a | condicao2

2 | s123 | 2011-07-10 13:16:10 | bla bla bla b | condicao2

3 | s123 | 2011-07-10 13:17:10 | bla bla bla c | condicao1

4 | s356 | 2011-07-10 13:18:10 | bla bla bla d | condicao1

5 | s356 | 2011-07-10 13:19:10 | bla bla bla e | condicao2

6 | s356 | 2011-07-10 13:20:10 | bla bla bla f | condicao2

7 | s356 | 2011-07-10 13:21:10 | bla bla bla g | condicao1

 

 

 

Quero uma consulta que me mostre apenas os registros onde condicao seja = condicao2 e que tenham a maior data, pegando apenas uma serial... no caso acima os registros que eu queria são apenas:

 

2 | s123 | 2011-07-10 13:16:10 | bla bla bla b | condicao2

6 | s356 | 2011-07-10 13:20:10 | bla bla bla f | condicao2

 

Sacaram?

 

 

Como devo fazer isso?

 

Ao meu ver, o exemplo do resultado que voce deixou tá errado ou voce não explicou direito ainda. Se voce quer apenas um registro da ultima data onde a condicao =2 então seria somente o id 6. Mas enfim...

Eh só seguir a ideia que passamos

"select * from tabela where condicao="condicao2" group by data desc order by id desc"

 

Espero ter ajudado.

Share this post


Link to post
Share on other sites

Então... essa é a dificuldade... mas repare que eu quero o da última data com a condicional2, mas isso para cada serial sacou?

 

Ou seja, repare que no exemplo que dei, os seriais elencados são diferentes...

 

Então... tem alguma sugestão nesse sentido?

Share this post


Link to post
Share on other sites

Então... essa é a dificuldade... mas repare que eu quero o da última data com a condicional2, mas isso para cada serial sacou?

 

Ou seja, repare que no exemplo que dei, os seriais elencados são diferentes...

 

Então... tem alguma sugestão nesse sentido?

 

Se eu entendi bem...digamos que os serials são "mini-categorias" que possuem um certo grupo de itens. Certo?

 

Caso seja, inclua na condição:

 

select * from tabela where condicao=2 and serial="s123" group by data desc order by id desc limit 1

 

Abrç...

  • +1 1

Share this post


Link to post
Share on other sites

Aí bateu na trave do que eu quero...

 

A grande questão é essa... quero que pegue os registros mais atuais de TODOS os seriais... sacou?

 

Da forma que você fez funciona, mas apenas para um serial, se eu tiro do where serial = '' ele me traz os registros, no entanto não me traz os mais atuais e sim os primeiros que ele encontra no banco...

 

Se fosse em access isso estaria funcionando a horas, mas em mysql não to conseguindo...

Share this post


Link to post
Share on other sites

Aí bateu na trave do que eu quero...

 

A grande questão é essa... quero que pegue os registros mais atuais de TODOS os seriais... sacou?

 

Da forma que você fez funciona, mas apenas para um serial, se eu tiro do where serial = '' ele me traz os registros, no entanto não me traz os mais atuais e sim os primeiros que ele encontra no banco...

 

Se fosse em access isso estaria funcionando a horas, mas em mysql não to conseguindo...

 

Tá mas este tipo de filtro é para um site ? E você só vai mostrar o ultimo item ou ele vem de algum formulário?

Share this post


Link to post
Share on other sites

Uhm, preferia não mover... acho que o caso é asp mesmo...

 

É para um site, mas não vem de formulário nenhum, veja, o que eu quero na realidade é o seguinte:

 

A mesma query tem que ter distinct (para pegar uma serial de cada), order by, limit, fora a cláusula de where...

 

Não sei... mas pra mim é alguma coisa na minha sintaxe que não tá batendo... como disse em access roda perfeitão...

Share this post


Link to post
Share on other sites

Uhm, preferia não mover... acho que o caso é asp mesmo...

 

É para um site, mas não vem de formulário nenhum, veja, o que eu quero na realidade é o seguinte:

 

A mesma query tem que ter distinct (para pegar uma serial de cada), order by, limit, fora a cláusula de where...

 

Não sei... mas pra mim é alguma coisa na minha sintaxe que não tá batendo... como disse em access roda perfeitão...

 

Creio que o distinct seja para se referenciar a tabelas aninhadas a esta. Se voce estiver usando outras tabelas que sejam relacionadas a esta, mostre aqui para que fique mais claro para nos.

 

Este filtro voce vai utilizar como em seu site?

Share this post


Link to post
Share on other sites

pessoal, obrigado pela atenção...
mas já consegui resolver assim, mt obrigado mesmo assim... bom dia p todos.. valeu...

SQL = "SELECT * FROM clientes ORDER BY id DESC LIMIT " & (PaginaAtual - 1) * pageSize & " , " & pageSize

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.