5 votes

Limite SQL nombre de groupes

Je essaie de créer une pagination simple mais il semble échouer à limiter le nombre de résultats.

SÉLECTIONNER * FROM visites GROUPE par clientID ORDRE PAR 'date' LIMIT $from, $to

Je veux obtenir seulement la première visite (chronologiquement) de chaque client et paginer les résultats.

Si je fais cette requête avec $from = 6, $to = 12 il renvoie environ 8 lignes au lieu de 7.

Qu'est-ce que je fais de mal?

6voto

hjpotter92 Points 24797

À partir de la documentation de MySQL sur la clause LIMIT

La clause LIMIT peut être utilisée pour limiter le nombre de lignes renvoyées par l'instruction SELECT. LIMIT prend un ou deux arguments numériques, qui doivent tous deux être des constantes entières non négatives (sauf en cas d'utilisation d'instructions préparées).

Avec deux arguments, le premier argument spécifie l'offset de la première ligne à renvoyer, et le deuxième spécifie le nombre maximal de lignes à renvoyer. L'offset de la première ligne est 0 (et non pas 1).

Lorsque vous choisissez $from comme étant 6 et $to comme étant 12 ; vous ne sélectionnez pas de la 6ème à la 12ème ligne ; vous allez sélectionner 12 lignes, en commençant par $from + 1 = 7.

2voto

Kara Points 2333

Le premier argument de la clause LIMIT est le décalage de départ et le second est le nombre de lignes à renvoyer. Par conséquent, votre requête devrait être :

... LIMIT $from, ($to - $from)

2voto

Colleen Points 2357

Avec le dbms et la syntaxe que vous utilisez, le deuxième nombre dans l'expression limit est le nombre de résultats autorisés, pas les points de décalage. Donc vous commencez à 6 et permettez les 12 résultats suivants, sans obtenir les résultats 6-12.

Si vous voulez obtenir les résultats 6-12, utilisez limit 5,7

1voto

Gordon Linoff Points 213350

Votre requête ne renvoie pas la première visite par date. Pour cela, vous devez réellement joindre ces informations :

select v.*
from visits v join
     (select clientid, MIN(date) as mindate
      from visits
      group by clientid
     ) vd
     on v.clientid = vd.clientid and v.date = vd.date
order by clientid
limit $from - 1, $to - $from

Votre requête initiale renvoie un ensemble arbitraire de colonnes concernant un client donné. Ces colonnes ne sont même pas garanties d'être issues du même enregistrement. Cela est dû à l'utilisation d'une (mauvaise) fonctionnalité de MySQL, où vous pouvez avoir des colonnes dans la clause select qui ne sont pas dans la clause group by et qui ne sont pas les arguments d'une fonction d'agrégation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X