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 :

Insérer une entrée à partir de 2 tables différentes


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Octobre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : en recherche d'emploi

    Informations forums :
    Inscription : Octobre 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Insérer une entrée à partir de 2 tables différentes
    Bonjour,

    j'aimerai insérer une entrée dans une table, en ayant besoin d'une donnée dans une table différente. Sauf que je n'arrive pas à grande chose. J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO menus_preferences( id_user, id_produit )
    VALUES ( 2, 10 ) ON DUPLICATE
    KEY UPDATE ( SELECT AVG( prix ) AS moyenne
    FROM menus_achats
    WHERE menus_achats.id_user =2
    AND menus_preferences.id_produit = menus_achats.id_produit
    AND MONTH( date ) > ( MONTH( date ) -3 ) ) cumul = cumul + preference * moyenne
    sans grand succès. Pouvez vous m'aider svp?
    en + j'aimerai la moyenne des 3 derniers mois, et je ne suis pas sûr de mon code (si on est en janvier j'ai peur que ça marche pas...)
    les champs cumul et preference sont dans la table menus_preferences et date dans la table menus_achats

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Tu ne respectes pas du tout le format attendu, à savoir :

    INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name
        [PARTITION (partition_name [, partition_name] ...)]
        [(col_name [, col_name] ...)]
        { SELECT ... 
          | TABLE table_name 
          | VALUES row_constructor_list
        }
        [ON DUPLICATE KEY UPDATE assignment_list]
    https://dev.mysql.com/doc/refman/8.0/en/insert.html

    Fais d'abord ton SELECT pour vérifier que le résultat à insérer en table est bon
    Ensuite tu pourras faire ton INSERT...SELECT

    Attention tout de même, tu devrais probablement faire une vue

    Dans le principe, ceci est faux :
    AND MONTH( date ) > ( MONTH( date ) -3 ) )
    Que se passe-t-il en janvier ? Tu aurais un mois à -2
    Il vaut mieux faire EXTRACT(YEAR_MONTH FROM ta_colonne_date) et EXTRACT(YEAR_MONTH FROM ta_colonne_date - INTERVAL 3 MONTH), teste avec le SELECT.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre à l'essai
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Octobre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : en recherche d'emploi

    Informations forums :
    Inscription : Octobre 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Je pense avoir résolu mon soucis, sauf qu'il me reste une erreur:
    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
    INSERT INTO menus_preferences( id_user, id_produit, cumul, preferences )
    VALUES (
    (
     
    SELECT 2 , 10, 0, AVG( prix ) AS moyenne
    FROM menus_achats, menus_preferences
    WHERE menus_achats.id_user =4
    AND menus_preferences.id_produit = menus_achats.id_produit
    AND EXTRACT(
    YEAR_MONTH FROM date) > EXTRACT(
    YEAR_MONTH FROM date - INTERVAL 3
    MONTH )
    )
    ) ON DUPLICATE
    KEY UPDATE cumul = cumul + preference * moyenne
    Avec ce code, il me met lerreur #1136 - Column count doesn't match value count at row 1. Pourtant j'ai bien 4 demande de champs et 4 résultats donc je comprends pas

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il faut enlever les parenthèses en double (ligne 3 et 13).

    Tatayo.

  5. #5
    Membre à l'essai
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Octobre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : en recherche d'emploi

    Informations forums :
    Inscription : Octobre 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Il faut enlever les parenthèses en double (ligne 3 et 13).

    Tatayo.
    J'avais déjà essayé, et dans ce cas j'ai cette erreur: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT 2 , 10, 0, AVG( prix ) AS moyenne FROM menus_achats, menus_preferences ' at line 3

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Une fois de plus la syntaxe n'est pas respectée.

    Tu fais :

    INSERT INTO ...
    VALUES ((SELECT ...))
    ON DUPLICATE KEY UPDATE ...
    Or il faut :

    INSERT INTO ...
    SELECT ...
    ON DUPLICATE KEY UPDATE ...
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Membre à l'essai
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Octobre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : en recherche d'emploi

    Informations forums :
    Inscription : Octobre 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    J'ai toujours appris que derrière un Insert Into il fallait values. D'où mon erreur.
    Sinon voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO menus_preferences( id_user, id_produit) VALUES (2,10)
    ON DUPLICATE
    KEY UPDATE cumul = cumul + preference *
    (SELECT AVG( prix ) AS moyenne
    FROM menus_achats
    WHERE id_user = 2 AND id_produit = 10
    AND EXTRACT(
    YEAR_MONTH FROM date) > EXTRACT(
    YEAR_MONTH FROM date - INTERVAL 3
    MONTH ) )
    ça fonctionne... si la valeur moyenne existe. Hors il peut arriver qu'il n'y ait aucune entrée dans la table menus_achats conforme à la selection. Donc ça me renvoie la valeur null. Comment remplacer ce null par 1, ou mieux encore: par une autre sélection?

    Edit: J'ai trouvé pour remplacer null:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COALESCE((SELECT AVG(prix) as moyenne FROM (
    SELECT prix FROM menus_achats WHERE id_user =4 AND 43 = id_produit ORDER BY date DESC LIMIT 0,2) as t),0)

  8. #8
    Membre à l'essai
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Octobre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : en recherche d'emploi

    Informations forums :
    Inscription : Octobre 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    merci à tous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2023, 13h14
  2. [OpenOffice][Tableur] insérer une feuille à partir d'un fichier
    Par Mariquiqui dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 16/11/2008, 11h36
  3. Réponses: 6
    Dernier message: 26/06/2008, 03h53
  4. Insérer une image à partir d'un fichier .jar
    Par gege87270 dans le forum Forms
    Réponses: 0
    Dernier message: 30/11/2007, 11h26
  5. Réponses: 9
    Dernier message: 19/09/2006, 19h27

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