|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Verona
Messaggi: 2514
|
[MySQL] trovare la posizione di un record
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: Codice:
SET @pos=0;
SELECT * FROM
(
SELECT id, time, @pos:=@pos+1 as pos
FROM table AS pt
ORDER by time DESC
) sub;
Codice:
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;
Qui si può vedere qualcosa di piu "specifico": http://s11.postimg.org/bdk2cksr7/rankjoin.png Qualche idea sul perché ? Accetti anche metodi alternativi
__________________
Le mie trattative |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
Codice:
select round(count(id)/10) from table where id <= 12345 order by time |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Verona
Messaggi: 2514
|
No purtroppo no, sarebbe troppo semplice sennò
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
__________________
Le mie trattative |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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: Codice:
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; |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:08.



















