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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top