Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

moltt

SELECT com ordenação em blocos

Recommended Posts

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,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem + algo que "desempate" o order by ?

Status = 0 são descartardos (id=6) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

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,

Compartilhar este post


Link para o post
Compartilhar em outros sites

A solução em Oracle era só uma ideia a ser adaptada, mas se resolveu, beleza.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.