Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 05/01/2012, 16h07   #1
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Par défaut INSERT INTO table SELECT

Bonjour,
Je suis actuellement sur un projet en C++ pour lequel j'utilise une base de données MySQL. Je travaille sous Builder C++.
Pour integrer MySQL, j'ai utilisé ce tuto.
Tout marche correctement, enfin presque...(sinon, je ne serai pas là )

J'ai une table ainsi :
TablePrincipale{
id
PNom VARCHAR(50)
PTrigramme1 VARCHAR(5)
PTrigramme2 VARCHAR(5)
PTrigramme3 VARCHAR(5)
}

Je souhaite effectuer une recherche dans cette table à partir des trois trigrammes, mais sans tenir compte de l'ordre.
Si je cherche AAA, BBB, CCC, ca doit me sortir tous les enregistrements pour lesquels le trigramme1, 2 et 3 contiennent (non respectivement) AAA, BBB, CCC (chaque trigramme contient 3 lettres).

Donc le resultat d'une recherche pour AAA, BBB, CCC doit être identique au résultat d'une recherche pour BBB, CCC, AAA.

A moins que j'ai raté quelque chose, la requête a rédiger est assez complexe. J'ai donc recherché sur le net une solution alternative : créer une table temporaire. Voici donc ma requete :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TEMPORARY TABLE table_temp(
nom VARCHAR(50)
trigramme2 VARCHAR(5)
trigramme3 VARCHAR(5));
INSERT INTO table_temp SELECT PNom, PTrigramme2, PTrigramme3 FROM TablePrincipale
WHERE PTrigramme1="AAA" OR PTrigramme1="BBB" OR PTrigramme1="CCC";
 
SELECT nom FROM table_temp WHERE
(trigramme2="AAA" OR trigramme2="BBB" OR trigramme2="CCC")
AND
(trigramme3="AAA" OR trigramme3="BBB" OR trigramme3="CCC")
DROP TABLE table_temp;
Ce code s’exécute correctement sur MySQL WorkBench, il me retourne bien ce que j'attend. Mais lorsque je l’exécute dans mon programme en C++, mySQL me signale qu'il y a une erreur de syntaxe dans :
Code :
1
2
INSERT INTO table_temp SELECT PNom, PTrigramme2, PTrigramme3 FROM TablePrincipale
WHERE PTrigramme1="AAA" OR PTrigramme1="BBB" OR PTrigramme1="CCC";
J'ai essayé de faire ceci :
Code :
1
2
INSERT INTO table_temp(nom, trigramme2, trigramme3) SELECT PNom, PTrigramme2, PTrigramme3 FROM TablePrincipale
WHERE PTrigramme1="AAA" OR PTrigramme1="BBB" OR PTrigramme1="CCC";
sans plus de succès.
Et même :
Code :
INSERT INTO table_temp SELECT PNom, PTrigramme2, PTrigramme3 FROM TablePrincipale;
ne marche pas mieux. J'ai toujours une erreur de syntaxe ALORS QUE LA MÊME REQUÊTE FONCTIONNE SUR WORKBENCH ! Je ne sais pas si le soucis vient de MySQL ou pas, mais je suis dans une impasse.

Si vous aviez des idées à me proposer, je suis preneur !
Je vous remercie par avance
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h24   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
À quoi correspondent ces trois trigrammes ?
Sont-ce les mêmes informations dans 3 colonnes différentes ou trois informations de nature différente ?

La recherche que tu veux faire suggère que ce sont les mêmes. Il y aurait alors une erreur de modélisation.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h28   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

N'auriez-vous pas un problème de modélisation ?

Vous avez une relation du type :
TablePrincipale-(0, 3)----POSSEDE-----(0, 1)-trigramme
voir :
TablePrincipale-(0, 3)----POSSEDE-----(0, n)-trigramme


Du coup votre requête aurai été beacoup plus simple à réaliser.


Concernant votre problème lié à votre code C++, ça n'est pas le bon forum.
(et il faudra fournir votre code C++ d'ailleurs vu que le problème réside là)

edit: Grillé !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 08h11   #4
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Erreur de modélisation ? Sûrement... J'ai fait au mieux, mais vraisemblablement, ce n'est pas bon.
J'ai déjà un table qui regroupe tous les trigrammes possibles.
Comment faire le lien entre cette table et ma TablePrincipale.
En fait, j'ai une TablePrincipale qui, pour chaque enregistrement doit associer 1, 2 ou 3 trigrammes.
Comment concevoir ma base de données ainsi ? J'avoue que je me suis torturé la tête sans parvenir à une solution :S
Merci d'avance pour votre aide !

A propos du C++, si vraiment le problème se reproduit ultérieurement, j'irai poser ma question sur le forum C (car la bibliothèque est en C). Mais si en changeant la modélisation, et par conséquent la requête, le problème ne se présente plus, je ne vais pas les embêter avec ça
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 10h03   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Si vous possédez une table complète de trigramme vous êtes dans ce cas là :
TablePrincipale-(0, 3)----POSSEDE-----(0, n)-trigramme

Est-ce bien 3 la limite maximum d'association entre les deux entités ?

Une fois que vous allez passer au MPD l'association POSSEDE va se transformer en table, et vous aurez donc :
TablePrincipale(id, ...)
TableTrigramme(tri_id, tri_nom, ....)
A_PRIN_TRI(prin_id, tri_id) avec prin_id qui sera une clef étrangère sur TablePrincipale et tri_id une clef étrangère sur la TableTrigramme


Il faudra aussi créer un trigger sur la table A_PRIN_TRI, pour qu'a l'insert vous vérifiez que vous n'avez pas plus de X (3?) trigramme associé à une même ligne de TableTrigramme.



Après ça votre requête va se transformer en :
Code :
1
2
3
4
5
6
7
8
 
SELECT id, PNom
FROM TablePrincipale prin
INNER JOIN A_PRIN_TRI asso ON prin.id = asso.prin_id
INNER JOIN TableTrigramme tri ON tri.tri_id = asso.tri_id
WHERE tri.tri_nom IN ('AAA', 'BBB', 'CCC')
GROUP BY id, PNom
HAVING count(*) = 3
P.S.: CinePhil me corrigera si j'ai fait une erreur au niveau modélisation mais logiquement c'est bon
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2012, 10h35   #6
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Merci à toi punkoff pour ta réponse.
C'est bien ca qui me manquait : une table intermédiaire qui associe ma tablePrincipale avec ma tableTrigramme.
J'ai fait la même erreur de modélisation dans d'autres parties de ma base de données. Bon, je vais retourner à ma modélisation.

Je ne savais pas ce qu'était un trigger. Je me suis renseigné, et je pense que, dans ce cadre là, il n'est pas utile d'en créer un. En effet, c'est mon application qui insère les données dans ma base, et c'est elle qui les utilise par la suite. Dans ma application, il est impossible d'assigner plus de trois trigrammes. Donc, pas de risques


Tant qu'on y est, et pour vérifier que j'ai bien compris, voici un autre cas (pour le même projet). Je renomme les tables et les données en quelques chose de simple.
J'ai une table contenant des informations pour une personne :
Individu {Nom, Age, Adresse, etc...}

Et chaque individu a travaillé une ou plusieurs fois pour des sociétés différentes pour lesquelles il faut mentionner les dates de début et de fin.
On a donc une table Date {id, DateDebut, DateFin}

La modélisation correspondante est-elle celle ci :
Individu-(0, n)----POSSEDE-----(0, n)-Date
ou celle là :
Individu-(0, n)----POSSEDE-----(1, 1)-Date
Si on se fiche que les mêmes dates puissent être communes à deux individus, autant prendre la deuxième solution ?

Et concretement, comment cela s'agence dans ma table ? Je propose mon idée et vous me corrigez si j'ai tord

Individu(id, nom, adresse, etc...)
Date(id, DateDebut, DateFin)
A_Individu_Date(idIndividu, idDate)

Au fait, pourquoi mettre un "A" devant le nom de ma troisième table ? Y-a-t'il un standard, ou une manière de bien appeler ses tables ?

Merci à vous par avance de répondre à mes (multiples) questions !
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 10h59   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Citation:
Envoyé par Jerome S Voir le message
Je ne savais pas ce qu'était un trigger. Je me suis renseigné, et je pense que, dans ce cadre là, il n'est pas utile d'en créer un. En effet, c'est mon application qui insère les données dans ma base, et c'est elle qui les utilise par la suite. Dans ma application, il est impossible d'assigner plus de trois trigrammes. Donc, pas de risques
Je me suis trompé, c'est une contrainte check qu'il faudrai mais MySql ne les supportes pas.
Par contre ceci n'est pas gérable applicativement, sauf si vous locker totallement la table avant de faire votre vérification + insertion... sinon => accès concurant : vous pouvez vous retrouver avec plsu de 3 trigrammes.

Citation:
J'ai une table contenant des informations pour une personne :
Individu {Nom, Age, Adresse, etc...}

Et chaque individu a travaillé une ou plusieurs fois pour des sociétés différentes pour lesquelles il faut mentionner les dates de début et de fin.
On a donc une table Date {id, DateDebut, DateFin}

La modélisation correspondante est-elle celle ci :
Individu-(0, n)----POSSEDE-----(0, n)-Date
ou celle là :
Individu-(0, n)----POSSEDE-----(1, 1)-Date
Si on se fiche que les mêmes dates puissent être communes à deux individus, autant prendre la deuxième solution ?

Et concretement, comment cela s'agence dans ma table ? Je propose mon idée et vous me corrigez si j'ai tord

Individu(id, nom, adresse, etc...)
Date(id, DateDebut, DateFin)
A_Individu_Date(idIndividu, idDate)

Au fait, pourquoi mettre un "A" devant le nom de ma troisième table ? Y-a-t'il un standard, ou une manière de bien appeler ses tables ?

Merci à vous par avance de répondre à mes (multiples) questions !
Alors pour les normes de nommage c'est comme bon vous semble, mais si vous n'avez aucune idée un exemple ici : http://sqlpro.developpez.com/cours/standards/

Concernant votre 2nd problème, les sociétés ne sont pas modélisées ?

Je vous laisserai passer par le forum modélisation car là je risque de vous orienter sur une mauvaise solution.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 11h18   #8
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Je vous remercie !
Je me penche de suite sur les normalisations des noms, et ensuite, j'irai poster un nouveau sujet dans la partie modélisation (qui est la source de mes problèmes).

Merci encore. Dois-je mettre ce sujet Résolu (vu que la question de base n'est pas résolu mais que mon problème l'est) ?
Jerome S est dé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 21h09.


 
 
 
 
Partenaires

Hébergement Web