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

Requêtes MySQL Discussion :

INSERT INTO table SELECT


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    À 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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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é !

  4. #4
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    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
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    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 !
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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.

    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.

  8. #8
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    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) ?
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

Discussions similaires

  1. INSERT INTO table SELECT
    Par ahmedige dans le forum Oracle
    Réponses: 1
    Dernier message: 13/07/2011, 16h40
  2. Réponses: 9
    Dernier message: 07/02/2008, 13h44
  3. Réponses: 12
    Dernier message: 25/11/2005, 12h29
  4. insert into table values/ insert into table select
    Par aaronw dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/05/2005, 15h14
  5. insert into from select ?
    Par axel584 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 25/01/2005, 18h10

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