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

SQL Firebird Discussion :

1 article dans plusieurs catégories


Sujet :

SQL Firebird

  1. #1
    Invité
    Invité(e)
    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) ?
    Dernière modification par Malick ; 07/08/2017 à 17h48. Motif: Ajout balises code

  2. #2
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Points : 1 493
    Points
    1 493
    Billets dans le blog
    1
    Par défaut
    Bonjour, tu as essayé

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    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
    Invité
    Invité(e)
    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
    Invité
    Invité(e)
    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
    )
    Dernière modification par Chtulus ; 08/08/2017 à 09h31. Motif: Balises Code ! Sélection du code et (#) dans la fenêtrer de rédaction des messages

  6. #6
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Points : 1 493
    Points
    1 493
    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
    Invité
    Invité(e)
    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 retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Invité
    Invité(e)
    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 retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    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 ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Invité
    Invité(e)
    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 retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    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)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. [Joomla!] afficher plusieurs articles dans la page
    Par hamzawii dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 16/09/2010, 16h27
  2. [Joomla!] Publier un article en frontend directement dans une catégorie définie à l'avance
    Par cpf2006 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 28/12/2009, 18h09
  3. [MySQL] comment ajouter plusieurs articles dans une BD MySql+tables temporaires
    Par forbidden_fruit dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/05/2008, 12h00
  4. [Typo3] Recherche CMS un article : plusieurs catégories
    Par SebCom dans le forum EDI, CMS, Outils, Scripts et API
    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