Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Preciso retornar um resultado de pesquisa que nunca fiz antes e não sei se é possível, por isso preciso da ajuda de vocês. É o seguinte, tenho uma tabela com cerca de 200 mil registros e umas 20 colunas. O resultado da pesquisa deve retornar um determinado tipo de registro a cada X registros como no exemplo abaixo:
Exemplo Tabela:
id status destaque nome
1 1 0 Jonas
2 1 0 Leo
3 1 1 Joao
4 1 0 Alex
5 1 1 Claudio
6 0 0 Lucas
7 1 1 Marisa
8 1 0 Marcio
9 1 0 Isadora
10 1 0 Vini
Exemplo retorno SQL:
id status destaque nome
3 1 1 Joao
1 1 0 Jonas
2 1 0 Leo
5 1 1 Claudio
4 1 0 Alex
8 1 0 Marcio
7 1 1 Marisa
9 1 0 Isadora
10 1 0 Vini
Reparem que o resultado retorna somente os registros com status 1 e com os destaques exibindo 1 a cada 3. É possível fazer apenas "um" comando MySQL que retorne dessa forma? Eu sei que posso fazer isso com mais de uma solicitação ao banco e ordenar com o PHP mas o que quero é justamente evitar conexões desnecessárias.
Desde já, agradecido.
Roger,
select * from usuario order by id limit [limite que vc queria exibir ]
Motta e Alex, obrigado por responderem.
Sim, os Status = 0 são descartados, como se fossem registros desligados, que não devem aparecer na listagem.
Imaginem que preciso do resultado inteiro, pois são muitos registros e tenho que fazer paginação, portanto não posso usar LIMIT ou não vou conseguir saber o número total de páginas que vou mostrar deste resultado. Então neste exemplo quero mostrar 3 registros por página, onde ficaria 1 destaque no topo de cada página.
Se eu fosse fazer apenas um order by destaque, iria amontoar todos os destaques nas primeiras páginas, não dando espaço para os que não são destaque nas primeiras páginas.
Compreendem o que preciso fazer?
Tendo em vista que neste exemplo quero mostrar 3 registros por página, o primeiro registro deve ser um destaque e os outros dois sem destaque, nesta sequencia por bloco (página), até que não exista mais destaques a retornar e assim poder retornar somente os sem detaque.
Uma solução para Oracle
select rownum, seqid,status,destaque,nome
from
(
select rownum, seqid,status,destaque,nome
from tabela
where status <> 0
and destaque = 1
union
select ceil(rownum/2) seq,id,status,destaque,nome
from tabela
where status <> 0
and destaque <> 1
) order by seq,destaque desc,id
rownum - coluna artificial que gera uma sequencia nas linhas
ceil - o maior inteiro mais próximo, a 2ª query gera uma seq. "dobrada"
Para MYSql deve-se fazer uma adaptação.
Obs : Não testei ....
Olá, Motta
Oracle já fica complicado aplicar nesse projeto, alto custo e a versão gratuita é muito limitada para o que preciso.
Tive que fazer diversas outras regras na pesquisa o que acabaria complicando ainda mais o resultado, então a melhor saída que encontrei foi retornar o resultado desordenado mesmo em uma conexão ao banco e ordenar via PHP.
De qualquer forma obrigado pela resposta, me ajudou a enxergar que ficaria muito complexo.
Abs,
A solução em Oracle era só uma ideia a ser adaptada, mas se resolveu, beleza.
Tem + algo que "desempate" o order by ?
Status = 0 são descartardos (id=6) ?