MySQL: Je dois obtenir le décalage d'un élément dans une requête
Question
Mysql: Je dois obtenir le décalage d'un élément dans une requête
.J'ai une galerie d'image: ce spectacle 6 image par pile, donc quand je demande l'image 22, il montre des images de 18 à 24. Il faut d'abord obtenir le décalage de l'image 22, puis obtenir les images de 18 à 24.
Un autre exemple: i demander le numéro d'image 62 (et décalées 62), cela permet de sélectionner des images avec décalage de 60 à 66
.est possible avec une seule requête?
La principale chose importante est d'obtenir la valeur de décalage de l'élément qui a son id égal à un nombre.
Merci;)
EDIT: * sélectionner à partir d'images ORDER_BY updated_at offset (ici je dois obtenir le décalage de l'identifiant d'image dans cette requête, et faire quelques calculs ... c'est ce que je dois, s'il est possible ..: d)
EDIT2: Maintenant, je comprends que je dois 2 requêtes:
1º: obtenir le décalage de l'image dans la requête avec ma commande personnalisée
2º: obtenir les images en utilisant le décalage de la première requête ... ce que je peut faire cavalier seul, le premier est le problème ..: s
La solution
Si vos images ont ID séquentiels, vous pouvez effectuer les opérations suivantes:
SELECT *
FROM images
WHERE id >= ((? DIV 6) * 6) AND
id < (((? DIV 6) + 1) * 6)
ORDER BY id;
Remplacez le paramètre ?
dans la requête ci-dessus avec l'ID de l'image demandée.
Mise à jour: Il semble que vos images ne sont pas commandés par un ID séquentiel, mais par un horodatage. Malheureusement, il semble que MySQL ne supporte pas les expressions variables dans la clause LIMIT
( Source). Une option serait d'utiliser une déclaration préparée:
PREPARE stmt FROM
" SELECT *
FROM images
ORDER BY updated_at
LIMIT ?, 6";
SET @lower_limit := ((22 DIV 6) * 6);
EXECUTE stmt USING @lower_limit;
Une autre option pourrait être:
SET @row = 0;
SELECT *
FROM images
WHERE (@row := @row + 1) BETWEEN ((3 DIV 6) * 6) + 1 and (((3 DIV 6) + 1) * 6)
ORDER BY updated_at;
Autres conseils
EDIT: Il semble MySQL ne permet pas ce genre d'expression dans la clause OFFSET. Si vous pouvez utiliser une instruction préparée (soit directement dans SQL ou dans une autre langue), vous pouvez faire le calcul à l'avance et l'utiliser. Voir Daniel La réponse de pour cela. Je laisse cette réponse ici à cause de l'autre information utile.
Ce que vous cherchez est appelé pagination. En MySQL, vous pouvez le faire avec les mots-clés LIMIT
et OFFSET
:
SELECT image
FROM images
ORDER BY updated_at
LIMIT 6
OFFSET (DIV(?, 6) * 6)
Remplacer ?
avec l'index d'image demandée. Notez que cela donnera des images avec des décalages 60, 61, 62, 63, 64, 65 lorsque vous demandez l'image 62. Je supposais le dernier décalage que vous avez donné dans les exemples était exclusive. Vous devez ajuster en conséquence si je fait l'hypothèse erronée.
Et une petite explication:
LIMIT
fait le retour de la requête que le nombre donné de résultats. Parce que vous voulez toujours six, qui le rend facile.
OFFSET
fait le retour de requête ne résulte que de l'offset donné. Le calcul fait la division entière par six et multiplie par six. Il en résulte le multiple précédent de six du nombre donné, exactement ce que vous voulez.
Je ne peux pas vous comprendre, mais pourquoi est-ce que vous avez à faire tout en MySQL?
Supposons que vous utilisez LAMP:
$pagination_start = (int)(floor($id_requested / 6)*6);
$offset_array = ($id_requested % 6);
$offset_mysql = $pagination_start + $offset_array;
Maintenant, vous avez début de votre $pagination_start
en pagination [à savoir 60] et a demandé image d'offset [à savoir 62] dans $offset_mysql
:
SELECT image
FROM images
ORDER BY updated_at DESC
LIMIT $pagination_start, 6
Maintenant, en retour, vous obtenez un tableau cotaning 6 images et celle demandée est à $result[$offset_array]
.
SELECT image
FROM images
ORDER BY updated_at
LIMIT 6, FLOOR($number / 6 ) * 6;