Lwyrn
31-10-2013, 10:11
Ho un sistema di paginazione in php e dovrei far in modo di trovare su che pagina si trovi un record con id x; considerando anche che sia l'ordinamento che la quantità di records per pagina visionabili è variabile. Non vorrei usare il metodo più esoso: parsare le pagine una ad una per trovare poi il riscontro. Vorrei usare un'unica query.
Quindi, l'idea, era quella di trovare a che posizione, sul database, il record X fosse posizionato. Poi con php fare un semplice "posizione/recordperpagina" e trovare così la pagina.
Perdendo un pò di tempo sono arrivato al punto di usare le user variables e sembra anche funzionare, finché alla query però non subentra una join!
Con una query del genere il ranking segue segue senza problemi l'ORDER:
SET @pos=0;
SELECT * FROM
(
SELECT id, time, @pos:=@pos+1 as pos
FROM table AS pt
ORDER by time DESC
) sub;
Mentre se aggiungo una join l'order viene praticamente ignorato e viene usato quello di default
SET @pos=0;
SELECT * FROM
(
SELECT id, time, @pos:=@pos+1 as pos
FROM table AS pt
JOIN table2 t2 ( ... )
ORDER by time DESC
) sub;
Che non è un gran problema nel momento di una left/right join, basta eliminarla e sarebbe uguale, ma nel momento di una inner join non si può ommettere.
Qui si può vedere qualcosa di piu "specifico": http://s11.postimg.org/bdk2cksr7/rankjoin.png
Qualche idea sul perché ? Accetti anche metodi alternativi :D
Quindi, l'idea, era quella di trovare a che posizione, sul database, il record X fosse posizionato. Poi con php fare un semplice "posizione/recordperpagina" e trovare così la pagina.
Perdendo un pò di tempo sono arrivato al punto di usare le user variables e sembra anche funzionare, finché alla query però non subentra una join!
Con una query del genere il ranking segue segue senza problemi l'ORDER:
SET @pos=0;
SELECT * FROM
(
SELECT id, time, @pos:=@pos+1 as pos
FROM table AS pt
ORDER by time DESC
) sub;
Mentre se aggiungo una join l'order viene praticamente ignorato e viene usato quello di default
SET @pos=0;
SELECT * FROM
(
SELECT id, time, @pos:=@pos+1 as pos
FROM table AS pt
JOIN table2 t2 ( ... )
ORDER by time DESC
) sub;
Che non è un gran problema nel momento di una left/right join, basta eliminarla e sarebbe uguale, ma nel momento di una inner join non si può ommettere.
Qui si può vedere qualcosa di piu "specifico": http://s11.postimg.org/bdk2cksr7/rankjoin.png
Qualche idea sul perché ? Accetti anche metodi alternativi :D