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

Requêtes MySQL Discussion :

requete sur 2 tables pour afficher 20 resultats par categorie


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut [RESOLU] requete sur 2 tables pour afficher 20 resultats par categorie
    Bonjour,

    j'ai 2 tables que voici

    categ (id, nom, ordre)
    item (id, id_cat, img, ordre)

    ma requete actuelle (fonctionne et) me renvoie tous les résultats de la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
      i.id AS id_item, 
      i.id_cat, 
      img, 
      i.ordre AS ordre_item, 
      datetime, 
      c.id AS idCat, 
      c.nom, 
      c.ordre AS ordre_cat 
    FROM categ AS c, item AS i 
    WHERE c.id = i.id_cat 
    ORDER BY ordre_cat DESC, ordre_item DESC;
    Je me débrouille donc dans mon script PHP pour obtenir cela
    while($row = mysql_fetch_assoc($query)) {

    - NOM_CATEG1
    --- item1
    --- item2
    --- item3
    ...
    --- item32

    - NOM_CATEG2
    --- item1
    --- item2
    --- item3
    ...
    --- item54

    }

    je cherche à récuperer seulement les 20 premiers items de chaque categorie

    est-ce possible en modifiant ma requete ou dois-je d'abord inserer mes résultats dans un tableau multidimensionnel pour ensuite en extraire les 20 premiers ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Bien sûr que c'est possible
    Par exemple, en faisant deux requêtes reliée par UNION ALL, chaque requête portant sur une catégorie, triée et limitée au 20 premiers enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select ...
    from categ AS c INNER JOIN item AS i on c.id = i.id_cat
    where c.id = id1
    order by ordre_cat DESC, ordre_item DESC
    LIMIT 20
    UNION ALL
    select ...
    from categ AS c INNER JOIN item AS i on c.id = i.id_cat
    where c.id = id2
    order by ordre_cat DESC, ordre_item DESC
    LIMIT 20
    Au passage, je te recommande d'écrire les jointures selon la norme SQL 2 (inner join... on...). Ca te permets de faire des jointures externes, c'est plus lisible et plus facile à maintenir

    ced

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    arf
    malheureusement, j'ai oublié de préciser ma version de mysql (4.1.14)

    #1221 - Incorrect usage of UNION and ORDER BY

    De toute façon, cette méthode ne me convient pas car il me faut connaître le nombre de categories (que je pourrais obtenir en faisant un COUNT(*) FROM categ), mais ça me rajoute une "pre-requete" pour pouvoir "constituer" ma requete initiale...
    Je suis pas sûr d'être très clair

    Merci quand même ced, en attendant peut-être une autre réponse je vais continuer de creuser la question, lire la doc, etc...

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    C'est pas grave, j'ai plus d'un tour dans ma besace .
    Tu as la possibilité de faire appel à la division relationnelle. J'ai appris ça sur le forum SQL il n'y a pas longtemps et c'est magique !!!
    Avec une version 4.1.14 de MySQL, tu peux faire des sous-requêtes.
    Donc, je te propose celle-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select ...
    from categ c inner join item i on c.id = i.id_cat
    where (select count(*)
          from item i2
          where i2.id_cat = i.id_cat
          and i2.ordre_item > i.ordre_item) < 20
    order by ordre_cat DESC, ordre_item DESC
    Je n'ai pas testé la requête, mais il se peut que ça te donnes en fait les 20 items les moins récents (encore que je ne pense pas, mais on sait jamais, le vendredi soir... ). Donc, dans ce cas, remplace le > par un < dans la sous-requête.

    Là ça doit marcher pour toutes les catégories, quel que soit leur nombre.

    ced

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Ah ouais génial !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT i.id AS id_item, i.id_cat, img, infobulle, titrebox, i.ordre AS ordre_item, datetime, c.id AS idCat, c.nom_fr, c.nom_en, c.ordre AS ordre_cat
    FROM categ c INNER JOIN item i ON c.id = i.id_cat
    WHERE (
    	SELECT count(*)
    	FROM item i2
    	WHERE i2.id_cat = i.id_cat
    	AND i2.ordre > i.ordre
    ) < 20
    ORDER BY ordre_cat DESC, ordre_item DESC
    Ca maaaaarche capitaine !

    Je mets un résolu... mais part pas trop loin ced, on ne sait jamais
    Merci encore

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

Discussions similaires

  1. une requete pour afficher le resultat d'un recherche
    Par hous04 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/09/2009, 00h22
  2. Requete sur deux tables - Afficher si et seulement si
    Par alphx75 dans le forum Requêtes
    Réponses: 4
    Dernier message: 09/07/2009, 10h21
  3. Croiser le resultat d'une requete sur 2 tables
    Par kacedda dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/09/2008, 17h33
  4. probleme de requete multi table pour exclure des resultats
    Par voilabad dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/05/2006, 08h49
  5. aide pour requete sur 2 tables avec clé étranere
    Par richton95 dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2005, 13h32

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