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

Langage SQL Discussion :

Requête SQL de recherche un peu compliquée


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 66
    Points : 45
    Points
    45
    Par défaut Requête SQL de recherche un peu compliquée
    Bonjour,

    Je développe un site internet et j'ai 3 tables avec les champs suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    TABLE AUTEURS
    auteur_id
    auteur_nom
    
    TABLE ARTICLES
    article_id
    article_auteur_id
    article_titre
    article_contenu
    
    TABLE COMMENTAIRES
    com_id
    com_auteur_id
    com_article_id
    com_date
    com_texte
    Et j'ai déja réalisé un formulaire qui lance une requête permettant de ressortir tous les auteur_id dont le mot-clé entré par l'utilisateur est présent dans un de ses articles (dans la requête ci-dessous, le mot entré par l'utilisateur est "motclé"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT auteur_id FROM auteurs, articles 
    WHERE auteur_id=article_auteur_id 
    AND article_contenu LIKE '%motclé%'
    GROUP BY auteur_id
    Or, j'aimerais maintenant pouvoir trier les résultats de cette recherche:
    • De l'auteur le moins commenté au plus commenté dans les derniers 7 jours
    • De l'auteur le plus commenté au moins commenté dans les derniers 7 jours
    • De l'auteur ayant écrit le plus d'articles au moins d'articles
    • De l'auteur ayant écrit le moins d'articles au plus d'articles
    • De l'auteur ayant écrit le plus de mots dans tous ses articles au moins de mots
    • De l'auteur ayant écrit le moins de mots dans tous ses articles au plus de mots


    (Pour information la table COMMENTAIRES permet de stocker tous les commentaires des visiteurs. Ces visiteurs peuvent commenter à la fois l'auteur ou ses articles. Lorsque je parle de l'auteur "le plus commenté", je parle donc des commentaires faits sur lui + les commentaires faits sur ses articles)

    Voila j'ai beau me creuser la tête, je n'arrive pas à trouver la bonne solution pour mettre en place ce système de recherche avec tri qui soit le moins lourd possible dans ce cas. Pourriez vous me donner un petit coup de mains chers amis

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Pour le tri sur le nombre d'articles, il ne reste plus grand chose à modifier sur votre requête, si ce n'est ajouter le ORDER BY et... utiliser les jointures normalisées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT auteur_id
    FROM auteurs
    INNER JOIN  articles 
        ON     auteur_id=article_auteur_id 
    WHERE article_contenu LIKE '%motclé%'
    GROUP BY auteur_id
    ORDER BY COUNT(*) [ASC|DESC]
    Pour classer selon le nombre de commentaires, il suffit d'ajouter une jointure sur la table des commentaires...

    et pour le nombre de mots... connaitre votre SGBDR ne sera pas inutile !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup aieeeuu!

    Est ce que dans la requete que tu proposes avec un "inner join" sur les commentaires, l'auteur_id ressortira même si celui-ci n'a pas encore de commentaires enregistrés? (car moi j'aimerais que meme un auteur qui n'a pas encore eu de commentaire ressorte à la recherche!).

    Autre petite question:
    Je ne connais pas le "inner join"! Est ce que tu peux m'indiquer la différence entre ta requête et celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT auteur_id
    FROM auteurs, articles 
    WHERE article_contenu LIKE '%motclé%'
    AND auteur_id=article_auteur_id
    GROUP BY auteur_id
    ORDER BY COUNT(*) [ASC|DESC]
    Sinon pour le nombre de mots, ma base c'est mysql et j'utilise PHP pour un site internet.

    Merci encore!

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Inner join et dinosaures
    Au sujet de la différence entre votre jointure et Inner Join.


    Ce sont deux styles différents en SQL pour programmer la jointure, laquelle fait partie des opérations proposées il y a 40 ans par Ted Codd, inventeur de la théorie relationnelle et dont SQL est un rejeton plus ou moins conforme (plutôt moins que plus du reste). Nul ne saurait vous blâmer d’utiliser le style en vigueur jusqu’au milieu des années quatre-vingt-dix (FROM T1, T2 WHERE expression booléenne), alors que — ça n’est pas le moindre des paradoxes ! — l’inventeur du style nouveau (FROM T1 INNER JOIN T2 ON expression booléenne), savoir Chris Date lui-même, utilise aujourd’hui l’ancien style quand il traduit une opération de l'algèbre relationnelle en SQL. Que celui qui se sent capable de tacler Chris lève la main ! Je vous renvoie à son ouvrage SQL and Relational Theory, pages 114-115.

    Cela dit, chez DVP l’usage est d’utiliser le style moderne, quand même plus lisible, même si logiquement parlant c’est bonnet blanc et blanc bonnet. Bien que dinosaure ès bases de données, je m'y suis mis sans problème, même si dans mes échanges avec CJD je conserve l'ancien style.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par ned-flanders Voir le message
    Est ce que dans la requete que tu proposes avec un "inner join" sur les commentaires, l'auteur_id ressortira même si celui-ci n'a pas encore de commentaires enregistrés? (car moi j'aimerais que meme un auteur qui n'a pas encore eu de commentaire ressorte à la recherche!).
    Avec cette requête, les auteurs n'ayant pas de commentaires ressortiront, mais pas ceux n'ayant pas d'article... Il faut pour cela utiliser une jointure externe, donc remplacer le INNER JOIN par une LEFT OUTER JOIN Ainsi, les lignes de la table auteurs n'ayant pas de correspondance dans la table articles apparaitront, et les colonnes de la table articles seront à NULL.
    Attention tout de même dans ce cas, le COUNT(*) renverra 1 même pour les auteurs n'ayant pas d'article, tout comme pour les auteurs ayant un seul article. Pour obtenir 0, spécifiez une colonne (non nullable) de la table de articles pour le COUNT, par exemple COUNT(article_auteur_id)...

    Le principe sera le même si vous faites une jointure sur la table des commenaires

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup pour vos réponses! Le sujet est bel et bien résolu!
    Merci encore

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

Discussions similaires

  1. [MySQL] Requête SQL pour recherche multicritères
    Par bili31 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/08/2011, 10h16
  2. [PHP 5.2] Résultat d'une requête dans un tableau un peu compliqué
    Par renaud26 dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2011, 06h28
  3. requête sql pour recherche par mois
    Par mahboubi dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/01/2009, 09h05
  4. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 08h25
  5. Recherche ibrairie pour éxécuter des requêtes SQL via C++
    Par daemon dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 14/06/2004, 10h28

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