Un "select" particulier (je ne sais pas comment faire ni même si c'est possible)

Résolu
Signaler
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
    Bonjour,

    Je développe un logiciel qui (entre autre) enregistre des
phrases en les découpant en mot (le pourquoi est un peut compliquer à expliquer
mais est justifiable).

       La première table est nommé "Phrase" contient 4
colonnes (ID_Phrase,langue,ID_Mot,Order_Mot)

       La seconde table est nommé "Mot" contient 2 colonnes
(ID_Mot,Mot)

Soit
par exemple :

    La phrase : "Bonjour tout le monde." sera stocké
dans deux tables :

      
----------------------------------------------         
----------------------

       | ID_Phrase | Langue | ID_Mot | Order_Mot
|         | ID_Mot
|     Mot     |

      
----------------------------------------------         
----------------------

       |        1  
     |  'FrFr'  |       0  
   |         0        
|         |     
0      | 'Bonjour'  |

       |        1  
     |  'FrFr'  |       1  
   |         1        
|         |     
1      |   
'tout'      |

       |        1  
     |  'FrFr'  |       2  
   |         2        
|         |     
2      |     
'le'       |

       |        1  
     |  'FrFr'  |       3  
   |         3        
|         |     
3      |  'monde.'  |

      
----------------------------------------------         
----------------------

<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:24pt;
height:24pt'/><![endif]--><!--[if !vml]--><!--[endif]-->    Pour le moment je sais écrire et lire une phrase sans
problème mais je voudrais maintenant savoir si une phrase existe déjà en base
ou non (sachant que je connais les ID_Mot de ma phrase à tester, <!--[if gte vml 1]><v:shape
id="_x0000_i1026" type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image002.gif"
o:href="http://www.sqlfr.com/imgs2/smile_blush.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--> je ne sais même pas si ça un intérêt )

    Sois avoir une requête à la quelle je passe mes mots (ou référence au mot) et
qui me renvoie un ID_Phrase si la phrase existe ou rien si elle n'existe pas.

Possible ou non à faire sous forme de requête?

Remarque : Je travail sous PostgreSQL.


J'espère avoir été claire.


Merci par avanceAmicalement
Pensez "Réponce acceptée"

15 réponses

Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Bon j'ai une autre requête qui semble juste par
contre il me semble que je suis limité en nombre de requête imbriquée (SVP dites
moi que non)



SELECT ID_Phrase FROM Phrase WHERE ID_Phrase IN    (SELECT ID_Phrase FROM Phrase WHERE ID_Mot 0 AND Order_Mot 0 AND ID_Phrase IN         (SELECT ID_Phrase FROM Phrase WHERE ID_Mot 1 AND Order_Mot 1 AND ID_Phrase IN             (SELECT ID_Phrase FROM Phrase WHERE ID_Mot 2 AND Order_Mot 2 AND ID_Phrase IN                 (SELECT ID_Phrase FROM Phrase WHERE ID_Mot 3 AND Order_Mot 3
                )
            )
        )
    )
GROUP BY ID_Phrase
HAVING(COUNT(ID_Phrase)) = 3

Amicalement
Pensez "Réponce acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Oups
Erreur de copier collé :
HAVING(COUNT(ID_Phrase)) = 4


Amicalement
Pensez "Réponce acceptée"
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
Bonjour,
Si la phrase "Tout le monde Bonjour" est différente de "Bonjour Tout le monde",  alors, je pense que le mieux serait une procédure Stockée ...

Dom
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Je ne sais pas faire de procédure stockée.
Si tu connais un tuto bien je suis preneur.


Par contre mon programme final devra être compatible à toutes les base de données en
passant par l'ODBC (heeeeee, suije claire????) et je crois que la déclaration
d'une procédure stoker n'est pas la même en postgreSQL et en MySQL par exemple
(à moins que je ne dise des grosses conneries???)

Je suis en train de faire un bout de code VB pour faire ce que j'ai demandé,
par contre du coup j'exécute autant de requête qu'il y à de phrase qui commence
par le même mot que la phrase que je teste (désol je n'arive pas à le dire plus clairement). Si tu sais faire une requête qui me retourne les deux phrases
"Tout le monde Bonjour" et "Bonjour Tout le monde" j'aurais
beaucoup moins de teste à faire par la suite.



La fonction VB (informatif et constante à ajouté) :
Private Function PhraseExisteEnBdD(ByRef ReferanceRetour As Long, ByRef TableauMot() As Long) As Boolean
Dim Donnees As ADODB.Recordset
Dim ChaineTansitionTexte As String
Dim ChaineMot As String
Dim Compteur As Long
Dim Compteur2 As Long
Dim Tansition_TexteTrouver As Boolean
    Connection.RequeteRecupDonnees "select clef_libelle from transition_texte where num_libelle=" & TableauMot(0) & " and order_libelle=0;", Donnees
    ChaineTansitionTexte = Donnees.GetString(adClipString, , Chr(2), Chr(1))
    Set Donnees = Nothing
    For Compteur = LBound(Split(ChaineTansitionTexte, Chr(1))) To UBound(Split(ChaineTansitionTexte, Chr(1))) - 1
        Tansition_TexteTrouver = True
        Connection.RequeteRecupDonnees "select num_libelle from transition_texte where clef_libelle=" & Split(ChaineTansitionTexte, Chr(1))(Compteur) & " order by order_libelle;", Donnees
        ChaineMot = Donnees.GetString(adClipString, , Chr(2), Chr(1))
        Set Donnees = Nothing
        If (UBound(TableauMot) - LBound(TableauMot)) = (UBound(Split(ChaineMot, Chr(1))) - 1) - LBound(Split(ChaineMot, Chr(1))) Then
            For Compteur2 = LBound(TableauMot) To UBound(TableauMot)
                If TableauMot(Compteur2) <> Split(ChaineMot, Chr(1))(Compteur2) Then
                    Tansition_TexteTrouver = False
                End If
            Next
        Else
            Tansition_TexteTrouver = False
        End If
       
        If Tansition_TexteTrouver Then
            ReferanceRetour = Split(ChaineTansitionTexte, Chr(1))(Compteur)
            PhraseExisteEnBdD = True
            Exit Function
        End If
    Next
    PhraseExisteEnBdD = False
End Function

Amicalement
Pensez "Réponce acceptée"
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
un truc comme ça .. ?
select id_phrase from phrase where id_mot in (select id_mot from mot where mot in (....))
group by id_phrase
 having(count(id_mot)) = nbmot

Dom
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Désol pour l'attente (client au tél)
MERCI!!!
Ce n'est pas exactement ce que je voulais (ce qui explique que je ne valide pas ta réponce pour le moment) mais les temps de traitements de mon appli on considérablement réduit graçe à toi (div par ~ 10!!!)

Amicalement
Pensez "Réponce acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Hooooo non !!!
Ta solution est bien pour postgreSQL mias il semble que MySQL ne sais pas faire de requete imbriqué.
ici en bas de la page :
http://sql.developpez.com/sqlaz/sousrequetes/
Je garde pour le momant mon code mega long

Merci quand même
Amicalement
Pensez "Réponce acceptée"
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
Apparement, tes infos datent
http://dev.mysql.com/doc/refman/5.0/fr/select.html

Dom
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Encor MERCI <!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:24pt;
height:24pt'/><![endif]--><!--[if !vml]--><!--[endif]-->

Tu sauve mon temps de traitement (ça vas m'évité de me faire insulté, voir pire,
lol)

A+
Amicalement
Pensez "Réponce acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
J'ai trouvé






Je fais une commande "INTERSECT" soit :




SELECT ID_Phrase FROM Phrase WHERE ID_Mot 0 AND Order_Mot 0

INTERSECT

SELECT ID_Phrase FROM Phrase WHERE ID_Mot 1 AND Order_Mot 1

INTERSECT

SELECT ID_Phrase FROM Phrase WHERE ID_Mot 2 AND Order_Mot 2

INTERSECT

SELECT ID_Phrase FROM Phrase WHERE ID_Mot 3 AND Order_Mot 3






Du fais que je construit mes requêtes par code programme (en VB) c'est super
simple à faire.

De plus (à moins que je ne dise des conneries) la commande
"INTERSECT" est en SQL2 donc compatible à quasi tous les types de
base de données.


Merci à tout ce qui on cherchés et bien sure merci à
"dominique.stock" pour ces réponses.




Amicalement



Pensez "Réponce acceptée"
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
Bien joué !!


Je ne savais pas que tu construisais tes requêtes.


INTERSECT  : moi j'utilise SQLServer et cela n'existe pas ... j'aimerais bien...


Encore une fois: Bien joué !







Dom
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Oups je m'embale


Ca marche pas!!!

Il vaudrais que j'ajoute "having(count(id_mot)) = nbmot" (si non
"Bonjour tout le monde" et "Bonjour tout le monde toto"
serons retourné par ma requête) par contre je n'y arrive pas ???

<!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image001.gif"
o:href="http://www.sqlfr.com/imgs2/smile_dead.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
INTERSECT n'existe pas en SQLServeur ???? Je vérifie si non je ne peut pas l'utilisé.<!--[if gte vml 1]><v:shape
id="_x0000_i1026" type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image001.gif"
o:href="http://www.sqlfr.com/imgs2/smile_dead.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->




Amicalement



Pensez "Réponce acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Ce coup ci je crois que c'est bon






SELECT ID_Phrase

FROM
Phrase WHERE
ID_Phrase IN




(SELECT
ID_Phrase FROM
Phrase WHERE
ID_Mot = 5 AND
Order_Mot = 0
INTERSECT
SELECT
ID_Phrase FROM
Phrase WHERE
ID_Mot = 6 AND
Order_Mot = 1
INTERSECT
SELECT
ID_Phrase FROM
Phrase WHERE
ID_Mot = 7 AND
Order_Mot = 2)




GROUP BY
ID_Phrase
HAVING(COUNT(
ID_Phrase)) = 3








Amicalement



Pensez "Réponce acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
<!--[if gte vml 1]><v:shapetype id= "_x0000_t75" coordsize="21600,21600"
o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:24pt;
height:24pt'/><![endif]-->
<!--[if !vml]-->
<!--[endif]-->


houainnnnnnnnnnn


<!--[if gte vml 1]><v:shape
id="_x0000_i1026" type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image002.gif"
o:href="http://www.sqlfr.com/imgs2/smile_sad.gif"/>
</v:shape><![endif]-->
<!--[if !vml]-->

<!--[endif]-->





Halo maman bobo...


Effectivement INTERSECT ne semble
pas être accepté par beaucoup de SGBD. ici : http://sql.developpez.com/sqlaz/fonctions/#L1.8



<!--[if gte vml 1]><v:shape id ="_x0000_i1027"
type="#_x0000_t75" alt="" style='width:24pt;height:24pt'/><![endif]-->
<!--[if !vml]-->
<!--[endif]-->
<!--[if gte vml 1]><v:shape id="_x0000_i1028"
type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"
o:href="http://www.sqlfr.com/imgs2/smile_angry.gif"/>
</v:shape><![endif]-->
<!--[if !vml]-->
<!--[endif]-->
Pourquoi ne suivent t'ils pas les normes SQL , bande de trollosses (insulte perso
signifiant "ressemblant à un troll", sois moche et bête)


Je reviens donc à ta solution dominique.stock.



Ca fais chi__!!!











Amicalement



Pensez "Réponce acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Houlaaaa, pardon
J'ai oublié de terminer ce topic!

Donc j'utilisais la dernierre requète (celles validés). Par contre je dévelope maintenant en DotNet donc par DataSet et ce n'est plus un problème une fois mes données chargé en mémoire de faire tout plein de requete (les temps de traitement sont négligable).

En tout cas Merci à tout ceux qui m'on aidé.

Amicalement
Pensez "Réponse acceptée"            <- Et c'est moi qui dit ça!!!