PDA

View Full Version : [MySQL] trovare la posizione di un record


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

VICIUS
01-11-2013, 06:36
Forse ho capito male. Ma qualcosa tipo questo penso possa bastare. 12345 è l'id del record di cui vuoi trovare la posizione e 10 è il numero di elementi per pagina.
select round(count(id)/10) from table where id <= 12345 order by time

Lwyrn
01-11-2013, 11:49
No purtroppo no, sarebbe troppo semplice sennò :D

Se lo ordini per tempo ci può anche stare, visto che "teoricamente" gli id dovrebbero venire progressivi col tempo.
Ma metti il caso stia ordinando per titolo decrescente.
Il titolo "Zip" sarebbe il record 12345 che in questo caso starebbe in prima pagina. Però dicendo "seleziona tutti i record che hanno id inferiore a 12345" mi troverà 12345 e me lo metterà sempre in ultima pagina

VICIUS
02-11-2013, 12:01
Ecco. Allora in mysql credo che l'unica sia usare @variabile ecc come hai già fatto. Non c'è, che io sappia, altro modo per trovare il numero della riga.

In sostanza qualcosa tipo questo:
set @r = 0;
select ceil(a.row_number / 15) as pagina from (select @r := @r + 1 as row_number, id from table order by time) a where a.id = 12345;