2010-12-14 11 views
2

Je dois être en mesure de trouver l'enregistrement suivant et précédent à partir d'un identifiant incrémental non auto.MYSQL Suivant Enregistrement précédent

L'ordre de tri correct à partir de la base de données utilise cet ordre par la déclaration:

Les travaux ci-dessous seulement pour lister tous les résultats d'une recherche. ORDER BY longueur (general.blockid), general.blockid, length (general.plotid), general.plotid

La page qui doit connaître l'enregistrement suivant et précédent contient l'identifiant/varchar unique dans l'URL. simplement? id = 100_1A

dans l'url exemple variables ci-dessus,

100_1A est dans la db comme blockplot

100 est la dans la db comme BlockID

1A est dans le datbase comme plotid

Lorsque je suis sur le dossier 100_1A, l'enregistrement suivant devrait être 100_1B. L'enregistrement précédent à 100_1a devrait être 99_6C

Mon problème est que comment puis-je interroger la base de données pour le prochain enregistrement lorsque je ne connais pas l'ordre jusqu'à ce qu'il soit trié?

L'ordre de tri que j'ai saisi est un tri fonctionnel pour la page de résultats de recherche.

Lorsqu'un utilisateur clique pour entrer dans un enregistrement spécifique, l'identifiant est transmis au ur le détail view.php? Id = 100_1a

Sur la page vue que je dois prendre 100_1A et utiliser le même sorte de voir ce dossier est avant et après 100_1A

Répondre

1

vous pouvez essayer cette

set @row:=0; 
select * from 
(
    select *, (@row:[email protected]+1) as row_number from your_tables 
    order by 
    length(general.blockid), general.blockid, 
    length(general.plotid), general.plotid 
) as rowset 
WHERE id='100_A'; 

ci-dessus vous donnera la position de 100_A avec la référence à la colonne row_number, et vous pouvez utiliser cette colonne pour déterminer la ligne suivante/précédente,

set @row:=0; 
select * from 
(
    select *, (@row:[email protected]+1) as row_number from your_tables 
    order by 
    length(general.blockid), general.blockid, 
    length(general.plotid), general.plotid 
) as rowset 
where 
    row_number in(first_query_row+1, first_query_row-1); 

S'il vous plaît noter que le coût de la requête pourrait très cher si la table est grande,
et vous pouvez envisager de créer un tableau récapitulatif vue pour stocker les row_number et UNIQID

Exemple de création tableau récapitulatif

create table ordering_table 
(
    row_number int(10) unsigned not null default 0, 
    blockid varchar(255), 
); /* no index, define yourself later */ 

set @row:=0 
insert into ordering_table 
    select @row:[email protected]+1, blockid from your_tables 
    order by ... 
+0

la table est énorme autour de 14 000 enregistrements. et sur quoi je travaille maintenant, je voudrais juste le prochain album après et celui précédent. Je vais vous donner quelques explications et voir si je peux le faire fonctionner. –

+0

Lorsque vous dites créer une vue pour stocker le row_number, que voulez-vous dire? –

+0

Wiew a certaines restrictions telles que ne permet pas de variable dans la requête de sélection. Le remplacement approprié sera créer un tableau récapitulatif qui contient le numéro de ligne + l'ID non-entier – ajreal

Questions connexes