Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Eu criei um sistema de leilão,porém eu preciso no final do leilão pegar o maior lance para diversos produtos diferentes,vou deixar uma print abaixo,porém o código sql que estou usando não está me trazendo os resultados corretamente.
SELECT id,id_produto,id_usuario,MAX(id_lance) FROM leilao_arremates GROUP BY id_produto

Obrigado pela ajuda...Faça o teste com esse código:
select le.id_usuario, le.id_produto, le.id_lance, le.data_lance
from leilao_arremates le
inner join (select id_produto,max(id_lance) as max_lance, min(data_lance) as min_data from leilao_arremates group by id_produto) X1
ON X1.max_lance = le.id_lance AND X1.min_data = le.data_lance AND X1.id_produto = le.id_produto
Fiz o teste com o seguinte código e não funcionou muito bem,alguns lances de alguns usuários acabaram ficando de fora,como se tivessem sido ignorados.
SELECT le.id_usuario, le.id_produto, le.id_lance, le.data_lance FROM leilao_arremates le INNER JOIN (SELECT id_produto,MAX(id_lance) as max_lance, MIN(data_lance) AS min_data FROM leilao_arremates GROUP BY id_produto) X1 ON X1.max_lance = le.id_lance AND X1.min_data = le.data_lance AND X1.id_produto = le.id_produto
Se tiver alguma outra sugestão,me avisa por favor..>
43 minutos atrás, Hulkstar disse:
Fiz o teste com o seguinte código e não funcionou muito bem,alguns lances de alguns usuários acabaram ficando de fora,como se tivessem sido ignorados.
SELECT le.id_usuario, le.id_produto, le.id_lance, le.data_lance FROM leilao_arremates le INNER JOIN (SELECT id_produto,MAX(id_lance) as max_lance, MIN(data_lance) AS min_data FROM leilao_arremates GROUP BY id_produto) X1 ON X1.max_lance = le.id_lance AND X1.min_data = le.data_lance AND X1.id_produto = le.id_produto
Se tiver alguma outra sugestão,me avisa por favor..
Você quer o lance máximo por ordem de chegada n é isso?
Detalhe mais o que você quer, poste a saída que deu rodando o código e a saída que você espera.Veja bem,vou deixar 2 prints,para você ter mais ou menos uma ideia do que eu preciso,se eu utilizar o código abaixo.
SELECT id,id_produto,extra_deck,id_usuario,id_lance,data_lance FROM leilao_arremates AS m1 WHERE id_lance = ( SELECT MAX(id_lance) FROM leilao_arremates AS m2 WHERE m1.id_produto = m2.id_produto)
O resultado que eu obtenho é o seguinte:

Como circulado acima,existe dois lances iguais,no caso o que teria que ser válido é apenas o primeiro lance,agora caso eu use o código abaixo.
SELECT le.id,le.id_usuario, le.id_produto, le.id_lance, le.data_lance FROM leilao_arremates le INNER JOIN (SELECT id_produto,MAX(id_lance) as max_lance, MIN(data_lance) AS min_data FROM leilao_arremates GROUP BY id_produto) X1 ON X1.max_lance = le.id_lance AND X1.min_data = le.data_lance AND X1.id_produto = le.id_produto
Eu tenho o seguinte resultado:

Resumindo,caso exista dois lances iguais,eu preciso que o sistema pegue o primeiro lance,de acordo com a data cadastrada no sistema.Spoiler
>
57 minutos atrás, Hulkstar disse:
Veja bem,vou deixar 2 prints,para você ter mais ou menos uma ideia do que eu preciso,se eu utilizar o código abaixo.
SELECT id,id_produto,extra_deck,id_usuario,id_lance,data_lance FROM leilao_arremates AS m1 WHERE id_lance = ( SELECT MAX(id_lance) FROM leilao_arremates AS m2 WHERE m1.id_produto = m2.id_produto)
O resultado que eu obtenho é o seguinte:

Como circulado acima,existe dois lances iguais,no caso o que teria que ser válido é apenas o primeiro lance,agora caso eu use o código abaixo.
SELECT le.id,le.id_usuario, le.id_produto, le.id_lance, le.data_lance FROM leilao_arremates le INNER JOIN (SELECT id_produto,MAX(id_lance) as max_lance, MIN(data_lance) AS min_data FROM leilao_arremates GROUP BY id_produto) X1 ON X1.max_lance = le.id_lance AND X1.min_data = le.data_lance AND X1.id_produto = le.id_produto
Eu tenho o seguinte resultado:

Resumindo,caso exista dois lances iguais,eu preciso que o sistema pegue o primeiro lance,de acordo com a data cadastrada no sistema.
Tente esse código, fiz com duas subqueries mas se der certo a gente tenta otimizar.
select lei.id_produto,lei.id_usuario, lei.id_lance,lei.data_lance from leilao_arremates lei,
(select le.id_produto, le.id_lance,min(le.data_lance) as min_data
from leilao_arremates le,
(select id_produto,max(id_lance) as max_lance from leilao_arremates group by id_produto) as x1
where le.id_lance = x1.max_lance
AND le.id_produto = x1.id_produto
group by le.id_produto, le.id_lance) as x2
where lei.id_produto = x2.id_produto AND
lei.id_lance = x2.id_lance AND
lei.data_lance = x2.min_data>
43 minutos atrás, kim.y disse:
Mostrar conteúdo oculto
Tente esse código, fiz com duas subqueries mas se der certo a gente tenta otimizar.
select lei.id_produto,lei.id_usuario, lei.id_lance,lei.data_lance from leilao_arremates lei,
(select le.id_produto, le.id_lance,min(le.data_lance) as min_data
from leilao_arremates le,
(select id_produto,max(id_lance) as max_lance from leilao_arremates group by id_produto) as x1
where le.id_lance = x1.max_lance
AND le.id_produto = x1.id_produto
group by le.id_produto, le.id_lance) as x2
where lei.id_produto = x2.id_produto AND
lei.id_lance = x2.id_lance AND
lei.data_lance = x2.min_data
Cara,funcionou perfeitamente,da maneira que eu estava querendo,muito obrigado mesmo,ajudou bastante.
Eu consegui fazer da seguinte maneira,porém eu gostaria de saber se existir lances iguais se teria como escolher o primeiro lance.
SELECT id,id_produto,id_usuario,id_lance FROM leilao_arremates AS m1 WHERE id_lance = ( SELECT MAX(id_lance) FROM leilao_arremates AS m2 WHERE m1.id_produto = m2.id_produto)