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

    Informations forums :
    Inscription : mai 2008
    Messages : 115
    Points : 63
    Points
    63

    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 éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    678
    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 : 678
    Points : 1 059
    Points
    1 059

    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 : 34
Taille : 41,3 Ko



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


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


    Page : 2

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

    Page : 3
    Nom : 20170617_P03.JPG
Affichages : 35
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 : 36
Taille : 10,1 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

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

    Informations forums :
    Inscription : mai 2008
    Messages : 115
    Points : 63
    Points
    63

    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 éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    678
    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 : 678
    Points : 1 059
    Points
    1 059

    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.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    9 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 9 940
    Points : 19 901
    Points
    19 901

    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...
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  6. #6
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    678
    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 : 678
    Points : 1 059
    Points
    1 059

    Par défaut

    Du moment qu'on utilise LIMIT non.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

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

    Informations forums :
    Inscription : mai 2008
    Messages : 115
    Points : 63
    Points
    63

    Par défaut

    Le soucis, c'est qu'avec SQlite le moteur me retourne l'erreur : unrecognized token: ":":

  8. #8
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    678
    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 : 678
    Points : 1 059
    Points
    1 059

    Par défaut

    Dans le titre de ta discussion il y a marqué mysql pas sqllite.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

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

    Informations forums :
    Inscription : mai 2008
    Messages : 115
    Points : 63
    Points
    63

    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. Pagination en PHP/MySQL
    Par picool dans le forum PHP & MySQL
    Réponses: 18
    Dernier message: 27/02/2012, 23h27
  2. Pagination comme Facebook (PHP/mysql)
    Par mecmec dans le forum AJAX
    Réponses: 0
    Dernier message: 14/10/2011, 17h39
  3. php/mysql INSERT avec Jointure
    Par vetea_t dans le forum PHP & MySQL
    Réponses: 2
    Dernier message: 17/11/2009, 08h29
  4. PHP-MYSQL: Requête avec jointures
    Par idamarco dans le forum PHP & MySQL
    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