1. #1
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2004
    Messages : 13
    Points : 9
    Points
    9

    Par défaut 1 article dans plusieurs catégories

    Bonjour,
    J'ai un petit soucis lorsque je souhaite lister toutes les articles de toutes les catégories mais sans les doublons (puisqu'un article peut très bien être dans 2 catégories).
    SQL : firebird / interbase

    ma requête pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT first 5 skip 0 
    ra.id, ra.date_debut_affiche, ra.image, ra.titre, ra.ra_url, ra.chapeau, ra.texte, ras.id_categorie 
    FROM ruche_actu_servprod ras inner join ruche_actu ra on ras.id_actu=ra.id 
    WHERE (ras.id_categorie='21' or ras.id_categorie='19' or ras.id_categorie='20') and ra.afficher='O' and ra.date_debut_affiche<='2017-08-07 16:04:00' and (ra.date_fin_affiche is null or ra.date_fin_affiche>='2017-08-07 16:04:00') 
    ORDER BY ra.date_debut_affiche desc
    Jusqu'à maintenant je supprimais les doublons en php une fois le résultat retourné mais maintenant, j'ai besoin de limiter mon nombre d'enregistrements à afficher avec first skip. Ma requête fonctionne mais au prochain first 5 skip 5 j'ai des doublons, ce qui est logique avec cette requête. Quelqu'un sait-il comment gérer une requête me permettant d'enlever les doublons sur la table ruche_actu_servprod (la table des catégories) ?

  2. #2
    Membre éclairé

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    mars 2002
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2002
    Messages : 377
    Points : 736
    Points
    736
    Billets dans le blog
    1

    Par défaut

    Bonjour, tu as essayé

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 402
    Points : 22 429
    Points
    22 429

    Par défaut

    Lorsqu'un article appartient à plusieurs catégories, laquelle choisis-tu de conserver dans ta liste ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2004
    Messages : 13
    Points : 9
    Points
    9

    Par défaut

    Bonsoir Michel,
    Select distinct, oui mais comment monter la requête, je ne suis pas assez assidu en sql pour lister les articles

    Bonsoir al1_24,
    Lorsqu'un article appartient à plusieurs catégories, ça ne me dérange pas d'avoir l'article de l'une ou de l'autre catégorie tant que l'article y figure (un max ou min de id_categorie).

    Ce dont j'ai besoin sent la requête imbriquée à plein nez mais j'avoue ne pas savoir la monter.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2004
    Messages : 13
    Points : 9
    Points
    9

    Par défaut

    Bon, j'avance peu à peu. Avec le distinct, comme dit Michel, ça me permet de sortir toutes les actus qui sont au moins de 1 catégorie. J'ai pris le max de l'id catégorie car l'essentiel étant d'afficher au moins l'actu, quelque soit sa catégorie.
    Il me reste un soucis, lister maintenant avec une requête imbriquée toutes les autres infos de la table "ruche_actu". Ma question plus bas après cette requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select distinct(id_actu) as id_actu , max(id_categorie) as id_categorie
    from ruche_actu_servprod ras, ruche_actu ra
    where ra.afficher='O' and ra.date_debut_affiche<='2017-08-07 16:04:00' 
    and (ra.date_fin_affiche is null or ra.date_fin_affiche>='2017-08-07 16:04:00')
    and ras.id_actu=ra.id
    group by ras.id_actu
    Comment faire un select de la table "ruche_actu" pour que ra0.id soit également à la première colonne trouvée dans ma seconde requête ra.id_actu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select 
    ra0.*
    from ruche_actu ra0 where ra0.id in 
    (
        select distinct(id_actu) as id_actu , max(id_categorie) as id_categorie
        from ruche_actu_servprod ras, ruche_actu ra
        where ra.afficher='O' and ra.date_debut_affiche<='2017-08-07 16:04:00' 
        and (ra.date_fin_affiche is null or ra.date_fin_affiche>='2017-08-07 16:04:00')
        and ras.id_actu=ra.id
        group by ras.id_actu
    )

  6. #6
    Membre éclairé

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    mars 2002
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2002
    Messages : 377
    Points : 736
    Points
    736
    Billets dans le blog
    1

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT ma_colonne FROM nom_du_tableau
    Cette requête sélectionne le champ « ma_colonne » de la table « nom_du_tableau » en évitant de retourner des doublons.
    Il suffit donc de mettre DISTINCT devant le nom qui ne doit pas se répéter..

    L’utilisation de la commande DISTINCT est très pratique pour éviter les résultats en doubles.
    Cependant, pour optimiser les performances il est préférable d’utiliser la commande SQL GROUP BY lorsque c’est possible.
    Ici, il faut donc grouper sur le champ qui définit l'article
    On pourrait compter count(ras.id_categorie) le nombre de catégories par article ce qui pourrait avoir une certaine utilité.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2004
    Messages : 13
    Points : 9
    Points
    9

    Par défaut

    La requête que je viens de monter ce matin fonctionne avec "distinct" comme vous le précisez justement avec une seule colonne. J'ai bien mes articles, sauf un GROS détail, je ne sais pas à quelle catégorie (id_categorie de la table ruche_actu_servprod). Il y a potentiellement plusieurs catégories possibles mais je souhaiterai au moins afficher le max() ou min() de la catégorie dans laquelle elle est affectée. Croyez-vous que ce soit possible ? Et de quelle manière ?
    J'avoue que je me fais des nœuds dans le cerveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select 
    ra0.*
    from ruche_actu ra0
    where ra0.id in 
    (
    	select distinct(ras.id_actu) as id_actu
        from ruche_actu_servprod ras, ruche_actu ra
        where ra.afficher='O' and ra.date_debut_affiche<='2017-08-07 16:04:00' 
    	and (ra.date_fin_affiche is null or ra.date_fin_affiche>='2017-08-07 16:04:00')
    	and ras.id_actu=ra.id
        group by ras.id_actu
    )

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 366
    Points : 19 388
    Points
    19 388
    Billets dans le blog
    4

    Par défaut

    Bonjour,

    il serait peut être temps de se mettre au SQL normalisé

    Tout d'abord pour l'union entre deux tables, mais aussi par l'utilisation de CTE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH  C AS (select distinct(ras.id_actu) as id_actu
        from ruche_actu_servprod ras JOIN  ruche_actu ra  ON  ras.id_actu=ra.id
         where ra.afficher='O' and ra.date_debut_affiche <='2017-08-07 16:04:00' 
    	and (ra.date_fin_affiche is null or ra.date_fin_affiche>='2017-08-07 16:04:00')
    --    group by ras.id_actu // inutile avec distinct)
     
    select ra0.* from ruche_actu ra0 JOIN C ON ra0.id=c.id_Actu
    pour obtenir les max ou min (ainsi d'ailleurs que plus de rapidité) oubliez le Distinct comme l'indique Michel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH C AS (SELECT ras.ID_actu as id_actu,MAX(ID_CATEGORIE) as CatMax ,MIN(ID_CATEGORIE) as CatMin
                        from ruche_actu_servprod ras JOIN  ruche_actu ra  ON  ras.id_actu=ra.id
                     where ra.afficher='O' and ra.date_debut_affiche <='2017-08-07 16:04:00' 
    	        and (ra.date_fin_affiche is null or ra.date_fin_affiche>='2017-08-07 16:04:00')
                     group by ras.id_actu)
    select ra0.*,ra from ruche_actu ra0 JOIN C ON ra0.id=c.id_Actu
    pour obtenir une liste de toutes les catégories il serait possible d'utiliser LIST(ID_CATEGORIE) dans la CTE C
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2004
    Messages : 13
    Points : 9
    Points
    9

    Par défaut

    Un immense Merci à vous SergioMaster, vous m'enlevez une épine du pied et m'empêchez de griller mes neurones.
    Je ne connaissais pas le mot clé "WITH" permettant de réutiliser mes colonnes pour une seconde requête. Du coup, je vois plein d'applications à ce que vous venez de m'apprendre.
    Vous avez raison, il faut que je me mette au SQL normalisé, ne serait-ce que si nous migrons, un jour, vers postgres.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 366
    Points : 19 388
    Points
    19 388
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par sniper2940 Voir le message
    Un immense Merci à vous SergioMaster,
    c'est à ça que sert le
    Vous avez raison, il faut que je me mette au SQL normalisé, ne serait-ce que si nous migrons, un jour, vers postgres.
    même sans migrer

    par contre, en retour, est-il possible de me dire où/comment vous hébergez la base de données firebird ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2004
    Messages : 13
    Points : 9
    Points
    9

    Par défaut

    Citation Envoyé par SergioMaster Voir le message
    c'est à ça que sert le

    par contre, en retour, est-il possible de me dire où/comment vous hébergez la base de données firebird ?
    L'entreprise dans laquelle je travaille héberge directement la base de données dans nos locaux sur une distribution linux Debian.
    Nous ne faisons pas appel aux services extérieurs par soucis de confidentialité des informations.

    Vous cherchez un hébergeur gratuit ou payant ? et surtout pour quel volume de données ?

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 366
    Points : 19 388
    Points
    19 388
    Billets dans le blog
    4

    Par défaut

    Re,
    Citation Envoyé par sniper2940 Voir le message
    Vous cherchez un hébergeur gratuit ou payant ? et surtout pour quel volume de données ?
    c'était plus par curiosité qu'autre chose c'est votre profil 'webmaster + php' qui m'a fait poser la question.
    Pour l'instant j'utilise moi aussi un serveur entreprise même si effectivement une solution hébergeur reste à l'étude (base de 1Go environ)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

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

Discussions similaires

  1. afficher plusieurs articles dans la page
    Par hamzawii dans le forum Joomla
    Réponses: 2
    Dernier message: 16/09/2010, 16h27
  2. Réponses: 1
    Dernier message: 28/12/2009, 18h09
  3. comment ajouter plusieurs articles dans une BD MySql+tables temporaires
    Par forbidden_fruit dans le forum PHP & MySQL
    Réponses: 2
    Dernier message: 19/05/2008, 12h00
  4. Recherche CMS un article : plusieurs catégories
    Par SebCom dans le forum Typo3
    Réponses: 6
    Dernier message: 30/11/2006, 14h49

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