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

PHP & Base de données Discussion :

PHP/mySQL jointure et pagination [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Par défaut PHP/mySQL jointure et pagination
    Salut,

    Soit les 3 tables suivantes :

    Table articles :
    ID STATUS DATE TITRE CORPS
    1 pub 201706071433 titre du billet 1 corps du billet 1
    2 dep 201706091112 titre du billet 2 corps du billet 2

    Table associations :
    IDART IDTAG
    1 2
    1 3
    1 4
    1 5
    1 6
    2 4
    2 3

    Table tags :
    ID TAG
    1 Non classé
    2 cuisine
    3 loisir
    4 maison
    5 mode
    6 musique

    Le résultat d'une requête qui est la jointure des 3 tables me retourne un paquet de lignes dont certaines ont plusisurs fois le même ID (normal lorsqu'un article à plusieurs tags).

    Mon problème est que je voudrais afficher 5 articles par page.
    Or mon article 1 comporte 5 tags et si je fais la requête suivante je me retrouve avec 1 articles et ses 5 tags, soit 5 lignes de l'article 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from articles
    inner join associations on
    associations.idart = articles.id
    inner join tags on
    associations.idtag = tags.id
    order by articles.id
    limit 0,5
    Du coup j'ai trouvé ceci (qui est bien mieux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from articles
    inner join associations on
    associations.idart = articles.id
    inner join tags on
    associations.idtag = tags.id
    where idart >= 1
    and idart <= 5
    order by articles.id
    Comment savoir ou on en est lorsque l'utilisateur voudra paginer.
    Imaginon qu'on en soit à la 2ème page donc aux articles 6 à 10 : comment dans mon liens pour les résultats suivant (soit une autre page, soit un AJAX) je sais que je dois retrouver les articles 11 à 15 ?
    Je pense à un cookie ou à un passage de params en GET ou POST...

    Qu'est-ce que vous utilisez ?
    Merci.

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Le principe est de calculer un nombre de pages. Dans ce cas, il y a une page pour 5 articles.
    La première page a le n° 0.

    Tu peux faire comme suit :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT art.id,titre,tag,page FROM articles as art
    INNER JOIN associations as ass ON art.ID = ass.idart
    INNER JOIN tags as tags ON tags.id = ass.idtag
    INNER JOIN 
    (
      select id,page from (select @c:=-1) as _ROWS 
      inner join (select @c:=@c+1, id, titre, floor(@c/5) as page from `articles`) A on 1=1
    ) as pages ON art.id = pages.id
    WHERE pages.page = <n° de page>

    Toutes mes données :

    Nom : 20170617_001.JPG
Affichages : 364
Taille : 41,3 Ko



    Page : 0
    Nom : 20170617_P00.JPG
Affichages : 262
Taille : 25,7 Ko


    Page : 1
    Nom : 20170617_P01.JPG
Affichages : 276
Taille : 25,2 Ko


    Page : 2

    Nom : 20170617_P02.JPG
Affichages : 330
Taille : 26,8 Ko

    Page : 3
    Nom : 20170617_P03.JPG
Affichages : 313
Taille : 13,2 Ko


    Si tu veux connaître les n° de pages min et max :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select min(page),max(page) from 
    (
      select id,page from (select @c:=-1) as _ROWS 
      inner join (select @c:=@c+1, id, titre, floor(@c/5) as page from `articles`) A on 1=1
    ) as pages

    Donne :
    Nom : 20170617_002.JPG
Affichages : 281
Taille : 10,1 Ko

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Par défaut
    Si je comprends bien cette façon de faire, ça implique de mettre un numéro de page dans la table, non ?

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Non. Pas du tout.
    La requête calcule un no de page (voir le 5 dans la requête) dynamiquement.
    Sinon tu peux toujours faire une requête qui te tire les 5 articles puis pour chaque article 1 requête pour le reste des informations. Je pense même que ça serait plus rapide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je me demande si on ne peut pas faire simplement :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT articles.id, * FROM articles
    ...
    ou encore
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM articles
    ...
    GROUP BY articles.id
    à tester...

  6. #6
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Du moment qu'on utilise LIMIT non.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Par défaut
    Le soucis, c'est qu'avec SQlite le moteur me retourne l'erreur : unrecognized token: ":":

  8. #8
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Dans le titre de ta discussion il y a marqué mysql pas sqllite.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Par défaut
    Oui oui, c'est par ce qu'il n'y existe pas de rubriques SQLite, et je m'attendais pas nu une réponse aussi pointue !
    J'espère que ça servira à d'autres personnes (je vais d'ailleurs mettre résolu dans le titre).
    Donc j'ai fait en PHP simple et je passe un paramètre à chaque page.

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

Discussions similaires

  1. [MySQL] Pagination en PHP/MySQL
    Par picool dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 27/02/2012, 23h27
  2. [AJAX] Pagination comme Facebook (PHP/mysql)
    Par mecmec dans le forum AJAX
    Réponses: 0
    Dernier message: 14/10/2011, 17h39
  3. [MySQL] php/mysql INSERT avec Jointure
    Par vetea_t dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/11/2009, 08h29
  4. [MySQL] PHP-MYSQL: Requête avec jointures
    Par idamarco dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/03/2009, 07h15
  5. [SGBD] mysql+php+recherche+jointure
    Par nizar05 dans le forum Requêtes
    Réponses: 6
    Dernier message: 09/12/2005, 12h10

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