Estou usando MySql e fiz um select que me retorna os 3 menores valores de uma tabela como o exemplo abaixo:
Se eu tiver algum valor repetido ele não me apresenta a repetição.
Se os preços das Tvs fossem 100,200,200,300,400 o select me retornaria 100,200,300 eliminando a repetição, mas o resultado que eu gostaria de obter é: 100,200,200,300;
mas o resultado que eu gostaria de obter é: 100,200,200,300;
Alguem sabe como posso fazer isso?
Você quer pegar apenas os 3 primeiros(100, 200, 200)?
Nesse caso não sua query já terá esse comportamento, agora se o que você quer é pegar os 3 menos valores distintos, você pode fazer:
select DISTINCT(menorPreco), <outras colunas que queira trazer> from protudo where item='tv' order by menorPreco asc limit 3";
S
socialclub
Olá Guilherme,
Obrigado pela resposta.
Eu quero pegar os 3 menores valores, caso um deles possua repetição também quero pegar a repetição entende?
Exemplo: os valores são 100, 200, 200, 300, 400.
Dai ele pegaria o primeiro valor que é 100, pegaria o segundo que é 200 e também a sua repetição 200 e o terceiro que é 300.
F
fredericomaia10
socialclub:
Olá Guilherme,
Obrigado pela resposta.
Eu quero pegar os 3 menores valores, caso um deles possua repetição também quero pegar a repetição entende?
Exemplo: os valores são 100, 200, 200, 300, 400.
Dai ele pegaria o primeiro valor que é 100, pegaria o segundo que é 200 e também a sua repetição 200 e o terceiro que é 300.
Neste caso citado o limite seria 4. Caso houvessem mais repetições o limite aumentaria proporcionalmente.
Talvez fosse melhor definir um limite máximo não importando as repetições e tratar isso a nível de aplicação.
Por exemplo, no banco buscar sempre os 10 menores e na aplicação realizar as verificações para retornar somente 3 e as repetições. Se bem que, e se você tiver por exemplo 100 registros e todos iguais, qual deveria ser o comportamento? É preciso entender melhor essa regra de negócio.
D
drsmachado
O teu select está, aparentemente, correto.
A questão é se a cláusula WHERE está sendo atendida a contento.
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
S
socialclub
fredericomaia10:
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
Isso Frederico. Exatamente isso que estou tentando fazer!
D
drsmachado
fredericomaia10:
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
Ele quer os três menores, isso significa que se ele tiver 5 registros com o preço R$ 0,01 (o menor preço possível a um produto), ele trará apenas 3, independente destes.
A pergunta dele é quanto à forma como o SELECT está trazendo os resultados, ao invés de 200, 200 e 300, ele traz 200, 300 e 400, ignorando uma das repetições.
D
drsmachado
socialclub:
fredericomaia10:
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
Isso Frederico. Exatamente isso que estou tentando fazer! :)
Se é isso, o limit 3 nunca vai contemplar mais que 3.
A melhor solução é fazer o select sem limit (ou um limit para paginação) e tratar na aplicação.
P
pmlm
O que ele quer é algo assim:
select p.* from produto p where p.item='tv' and p.menorPreco IN (SELECT distinct p2.menorPreco FROM produto p2 where p2.item='tv' order by p2.menorPreco asc limit 3) order by p.menorPreco asc
Nota: Não sei se no mysql dá para fazer o inner select assim.
F
fredericomaia10
drsmachado:
socialclub:
fredericomaia10:
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
Isso Frederico. Exatamente isso que estou tentando fazer! :)
Se é isso, o limit 3 nunca vai contemplar mais que 3.
A melhor solução é fazer o select sem limit (ou um limit para paginação) e tratar na aplicação.
Foi o que eu sugeri. É o que acho também.
S
socialclub
fredericomaia10:
drsmachado:
socialclub:
fredericomaia10:
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
Isso Frederico. Exatamente isso que estou tentando fazer! :)
Se é isso, o limit 3 nunca vai contemplar mais que 3.
A melhor solução é fazer o select sem limit (ou um limit para paginação) e tratar na aplicação.
Foi o que eu sugeri. É o que acho também.
Se eu fizer o select sem limit ele vai me retornar todos os valores da tabela, não seria isso?
F
fredericomaia10
Sim. Pode trazer apenas ordenado pelo menor. E na aplicação, no Java, você faz a lógica que quer.
D
drsmachado
socialclub:
fredericomaia10:
drsmachado:
socialclub:
fredericomaia10:
drsmachado pelo que entendi do que ele pediu, neste exemplo que você deu o retorno que ele queria era 200, 200 (mesmo que repetido), 230, 240.
Ou seja os 3 menores, porém se houver algum repetido tem que traze-lo também. Retornando no exemplo acima, 4 registros e não 3.
O.o
Isso Frederico. Exatamente isso que estou tentando fazer! :)
Se é isso, o limit 3 nunca vai contemplar mais que 3.
A melhor solução é fazer o select sem limit (ou um limit para paginação) e tratar na aplicação.
Foi o que eu sugeri. É o que acho também.
Se eu fizer o select sem limit ele vai me retornar todos os valores da tabela, não seria isso?
Todos os que coincidirem com a cláusula where
D
drsmachado
Ah, e quanto a sugestão do PMLM:
mysql>select*FROMproduto->wherevalorIN(selectdistinct(valor)fromprodutoorderbyvalorasclimit3);ERROR1235(42000):ThisversionofMySQLdoesn't yet support 'LIMIT&IN/ALL/ANY/SOMEsubquery'
Então, apenas uma SP poderia resolver, direto no banco.
Na aplicação, ele pode realizar uma consulta, obter os 3 menores preços e então fazer uma nova busca…