Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/11/2011, 11h33   #1
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
Par défaut Comment trouver la phrase qui contient le plus de mots d'une liste ?

Bonjour,
je recherche une aide pour résoudre le problème suivant :
j'ai 3 tables,
phrases(id,texte)
mots(id,texte)
mots-dans-phrases(mots_id,phrases_id)

La table mots-dans-phrases est constiuée avec les id (clé primaires) des tables phrases et mots. et liste la présence des mots dans les phrases. Plusieurs entrées identiques peuvent coexister.

Mon objectif est selon un jeu de mots uniques donné, trouver la phrase qui en contient le plus.
Merci d'avance
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 11h55   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
Compter le nombre de mot dans une chaine de caractères n'est pas une fonction standard de SQL.

Cette fonction peut peut-être exister dans certains SGBD ?? Elle n'existe pas sous FIREBIRD.

Il est donc impératif d'indiquer ton SGBD (comme le demande les règles du forum )

Dans le cas contraire, il faut passer par une procédure stockée et utiliser la fonction POSITION (dans FIREBIRD).
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 12h02   #3
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
Il ne s'agit pas de compter les mots dans la phrase mais de trouver dans la 3eme table l'id de la phrase ayant le plus de correspondances différentes avec les mots d'une liste donnée.
Je sèche!
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 12h03   #4
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
SGBD : MYSQL (j'avais oublié)
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 12h10   #5
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
Là, à ma connaissance, pas d'autres choix que de passer par une PS en utilisant la fonction POSITION (ou équivalent).
Elle retourne la position du mot dans la chaine. Si le résultat est supérieur à zéro, le mot est présent et faire ainsi de suite pour les mots de la table "mots" et pour les chaines de la table "phrases".

Je ne connais pas MySql, Sorry (je ne sais même pas si les PS existe sous MySql )
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 12h22   #6
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
C'est une solution mais assez lourde je pense. Mysql supporte les PS.
Merci
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 12h51   #7
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
oui et non

la PS ne sera demande qu'a la création/modification d'une phrase, non
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 13h21   #8
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
En fait,
je stocke dans la table 1 les phrases.
Je stocke dans la table 2 les mots.
Je stocke dans la table 3 les correspondances mots<=>phrase au moment ou j'enregistre une nouvelle phrase. Par exemple la phrase "papa part en voyage" ayant l'id 23 lors de son enregistrement, je stokerai l'id du mot "papa" avec id 23. et ainsi pour les autres mots.

Par la suite, j'ai une liste de mots par exemple (papa, revient, de, voyage), il me faut trouver l'id de la phrase contenant le plus de ces mots. L'id 23 en contiendra 2 (papa et voyage).
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 13h36   #9
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
La PS doit être déclenchée à chaque ajout/modif des tables "Mots" et "Phrases".


Attention, pour un changement de phrases, il faudrait effacer toutes les occurrences de cette phrase dans la table "mots-dans-phrases" (pour tenir compte du cas d'un mot qui disparait de la phrase).

en FIREBIRD, le principe serait
Code :
1
2
3
4
5
6
7
8
9
10
11
FOR SELECT Mots.id
                 Mots.Texte
    FROM Mots
    INTO : Id_Mot
           :Mot
DO Begin
         IF (Position(:Mots, :Phrase) > -1) THEN
         Begin
            --  Ecrire dans la table "mots-dans-phrases" le id_mot et id_phrase
         End
     End
Bien sur à adapter (au contexte, et à MySql)
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 14h18   #10
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
Il y a confusion.
Pour écrire les données dans les tables pas de problème.
A la limite il ne faut considérer QUE la 3eme table :
id_mot | id_phrase
qui garde enregistré que tel mot se retrouve dans telle phrase.

A partir d'une liste de id_mot, retrouver le ou les id_phrase qui a/ont le plus de id_mot de la liste liés à lui.
Pour une liste de 2 ou 3 id_mot pas de problème mais au-delà les combinaisons sont exponentielles!
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 14h29   #11
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Je pense à quelque chose comme ça (non testé):
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT p.id, p.texte, count(DISTINCT mp.mots_id) AS nb
  FROM phrases p
  JOIN mots_phrases mp ON mp.phrase_id = p.id
  JOIN mots m ON m.id = mp.mots_id
 WHERE m.texte IN ('liste', 'de', 'mots')
 GROUP BY p.id, p.texte
HAVING count(DISTINCT mp.mots_id) >= ALL (SELECT count(DISTINCT mp2.mots_id)
                                            FROM mots_phrases mp2
                                            JOIN mots m2 ON m2.id = mp2.mots_id                                           
                                           WHERE m2.texte IN ('liste', 'de', 'mots')
                                           GROUP BY mp2.phrase_id)
Ca permet de gérer les égalités (plusieurs phrases contenant chacune le même nombre de mots distinct)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 14h37   #12
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 0
Points : 0
Je pense que c'est surement la bonne voie.
Je vais tester demain et confirmer.
Bon 1er novembre
jmbonni2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 14h38   #13
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
Il y a 2 choses :
1 Construire la table "mots-dans-phrases"
2 Compter les mots dans les phrases, etc

Pour 2, c'est facile. Il faut utiliser les fonctions d’agrégation et de comptage
* quel est la phrase qui a le plus de mots
Code :
1
2
3
4
5
6
SELECT Sel.Id_Phrase,
       MAX(Nb)
  FROM (SELECT Mp.Id_Phrase,
               COUNT(*) AS Nb
          FROM "Mots-Dans-Phrases" Mp
          GROUP BY Mp.Id_Phrase) AS Sel
etc

Mais d'après ce que j'avais compris, c'était le remplissage de la table "mots-dans-phrases" qui posait des difficultés, non ?
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 08h47   #14
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
oups désolé j'avais effectivement mal compris la question

et pourtant son libellé était clair

Disons que c'est la fatigue d'un jour férié

désolé encore ....
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h31.


 
 
 
 
Partenaires

Hébergement Web