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;
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.[/quote]
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.
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
[quote=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[/quote]
Isso Frederico. Exatamente isso que estou tentando fazer!
[quote=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[/quote]
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.
[quote=socialclub][quote=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[/quote]
Isso Frederico. Exatamente isso que estou tentando fazer! :)[/quote]
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.
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.
[quote=drsmachado][quote=socialclub][quote=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[/quote]
Isso Frederico. Exatamente isso que estou tentando fazer! :)[/quote]
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.[/quote]
[quote=fredericomaia10][quote=drsmachado][quote=socialclub][quote=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[/quote]
Isso Frederico. Exatamente isso que estou tentando fazer! :)[/quote]
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.[/quote]
Foi o que eu sugeri. É o que acho também. [/quote]
Se eu fizer o select sem limit ele vai me retornar todos os valores da tabela, não seria isso?
[quote=socialclub][quote=fredericomaia10][quote=drsmachado][quote=socialclub][quote=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[/quote]
Isso Frederico. Exatamente isso que estou tentando fazer! :)[/quote]
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.[/quote]
Foi o que eu sugeri. É o que acho também. [/quote]
Se eu fizer o select sem limit ele vai me retornar todos os valores da tabela, não seria isso?[/quote]
Todos os que coincidirem com a cláusula where
mysql> select * FROM produto
-> where valor IN (select distinct(valor) from produto order by valor asc limit 3);
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
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…