IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Mettre un pas dans un SELECT


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut Mettre un pas dans un SELECT
    Bonjour à tous.

    J'ai une table qui contient des news. Voici deux champs interessants:
    - id (auto-incrémenté)
    - post_time (nombre de secondes écoulées depuis l'EPOCH)

    Je voudrais afficher ces news classées par leur timestamp. Le problème c'est qu'il y a beaucoup de news et que c'est une base MySQL à afficher avec du PHP dans un navigateur, donc ça serait bien de faire un système de pagination. Il faut maintenant gérer le lien vers les différentes pages.

    Ma solution (qui permet de résoudre aussi le problème de la recherche): mon script affiche la page qui contient la news dont l'ID est $contains (passé en paramètre). Pour mettre un lien vers une certaine page, il faut donc connaître l'ID de la première news de la page.

    Maintenant voila ma question en rapport avec SQL: est-ce qu'il existe une fonction ou un je ne sais quoi (appelons-le ROW_NUM) qui retourne le numéro courant de la ligne dans le résultat de la requête, pour faire un truc du genre (afin d'avoir l'ID de la première news de chaque page):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id
    FROM news
    HAVING ROW_NUM MOD $nombre_de_news_par_page = 0 
    ORDER BY post_time
    Ce qui ne peut pas marcher: faire un modulo sur l'id car il peut y avoir des suppressions de news.

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Salut,

    Sous MySQL, il existe "LIMIT x, y" à placer en fin de requête SELECT. Comme cette commande l'indique, elle permet de limiter les résultats. Elle permet également de spécifier une borne de départ (x), et donc aussi une borne de fin (y)

    Dans ton cas, tu peux par exemple passer en paramètre le numéro de page. Puis faire à chaque fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ...
    FROM ...
    WHERE ...
    LIMIT 1 + (numPage * nbEnregistrementsParPage), ((numPage +1) * nbEnregistrementsParPage)
    Avec numPage qui commence à 0.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Pour cela vous pouvez utiliser les fonctions de fenêtrage de la norme SQL comme RANK, DENSE_RANK, ROW_NUMBER... Voyez si MySQL les implémentent.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    Malheureusement non, mais c'est une piste interessante. J'ai opté pour une solution hybride: je donne simplement le numéro de page en paramètres comme le suggérait Bigloo et j'ajoute une fonction pour convertir un ID en couple (page, position dans la page).

    Il y a cependant un truc que je ne comprends pas dans ta solution, Biglo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIMIT 1 + (numPage * nbEnregistrementsParPage), ((numPage +1) * nbEnregistrementsParPage)
    Normalement, les colonnes sont numérotées à partir de 0 et non de 1, non?

  5. #5
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Citation Envoyé par ShootDX
    Normalement, les colonnes sont numérotées à partir de 0 et non de 1, non?
    En effet, les lignes sont numérotées à partir de 0. Mais le principe est là.

    En plus, je me suis complètement planté pour le deuxième argument de LIMIT. Il s'agit du nombre maximum d'enregistrements à retourner, et non l'offset du dernier. Mais tu l'auras sûrement remarqué.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre une clause dans un select count
    Par xeron33 dans le forum Oracle
    Réponses: 6
    Dernier message: 04/04/2012, 19h10
  2. mettre une image dans un select pendant sa maj
    Par alpha232 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/07/2010, 20h54
  3. Elément qui n'apparait pas dans le SELECT
    Par mattyeux dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 06/11/2007, 17h04
  4. Réponses: 5
    Dernier message: 20/09/2005, 14h39
  5. Réponses: 13
    Dernier message: 20/07/2004, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo