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 avec SELECT MAX


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 48
    Points : 21
    Points
    21
    Par défaut INSERT avec SELECT MAX
    Bonjour,

    Je bloque sur une requête depuis quelques temps et je viens donc chercher vos lumières.

    J'ai une table t1 dans laquelle j'ai une liste de champs et notamment un id_product (clé primaire) et un id_category
    J'ai une table t2 dans laquelle j'ai 3 champs : id_product, id_category, position. Dans cette table, c'est l'ensemble id_product et id_category la clé primaire. C'est à dire qu'un même id_product peut être dans plusieurs catégories. La position détermine l'emplacement du produit dans la catégorie.

    Je cherche à insérer les champs qui sont dans t1, dans t2 en ignorant les erreurs. Ca ça va je sais faire.

    Là où je bloque c'est pour mettre à jour le champ position. J'ai pensé à faire un MAX(position) + 1 WHERE t1.id_category = t2.id_category mais ça me renvoie une erreur.

    Ci-dessous mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT IGNORE INTO pre5181_category_product (id_category, id_product, position)
    SELECT p.id_category_default, p.id_product, MAX(cp.positon) + 1
    FROM pre5181_product p, pre5181_category_product cp
    WHERE p.id_category_default = cp.id_category;
    et l'erreur que Navicat me renvoie :
    [Err] 1054 - Unknown column 'cp.positon' in 'field list'

    En espérant avoir été assez clair.

    Merci d'avance pour votre aide !

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Vous avez oublié le 2ème 'i' dans position (vous avez écrit positon)

    De plus c'est une mauvaise idée de nommer une colonne avec un nom de fonction : position()

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Merci pour votre aide !

    En effet, le unknown colonne aurait dû me mettre la puce à l'oreille.
    La requête ne renvoie plus d'erreur, par contre le champ ne se crée pas. J'ai testé sans insérer le champ position et là ca marche, le problème vient donc de là.

    PS : c'est une base prestashop, le champ position était déjà nommé comme ça.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    J'ai dupliqué ma table product en laissant 1 seul enregistrement et là ca marche. Par contre dès que j'en créé un 2ème (doublon ou non), ça ne fonctionne plus. Si ça peut vous aider à voir d'où vient le problème..

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut tibiscuit.

    Citation Envoyé par tibiscuit
    La requête ne renvoie plus d'erreur, par contre le champ ne se crée pas.
    On ne parle pas de champ mais de colonne lorsqu'il s'agit de bases de données.
    La colonne a été créé lors de la création de votre table. On dit plutôt que la ligne ne s'est pas insérée dans votre table.

    La prochaine fois, essayez d'adopter le langage des bases de données afin de mieux vous faire comprendre.
    J'ai l'impression de ne pas parler la même langue que vous !

    L'insertion ne s'est pas faire car vous avez indiquez "INSERT IGNORE INTO".
    Le "IGNORE" signifie que le code retour sera toujours à zéro, même en cas d'une erreur lors de l'insertion.
    Par exemple, en cas de doublon sur une clef déjà existence.

    La question que vous devez vous poser, dans le cas d'un doublon, est de savoir si vous désirez mettre à jour votre table ou pas ?

    Si vous désirez rejeter le doublon alors votre requête est correcte.
    Si vous désirez mettre à jour (écraser la ligne déjà existante) alors remplacer le "INSERT IGNORE INTO" par un "REPLACE INTO".
    --> http://dev.mysql.com/doc/refman/5.7/en/replace.html

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Merci pour vos réponses et désolé pour le mauvais vocabulaire.

    Je vais essayer d'être plus clair dans ce que je veux faire.

    j'ai une table product dans laquelle 2 colonnes m'intéressent.
    Exemple :
    id_product id_category
    1 10
    2 10
    3 11
    4 11
    5 12
    6 13

    J'ai une table category_product de ce type :
    id_product id_category position
    1 10 0
    2 10 1
    3 11 0
    4 11 1
    5 12 0
    6 13 0

    La colonne position indique la position du produit dans la catégorie. Elle recommence donc à zéro pour chaque catégorie.

    J'insère de nombreuses lignes dans la table product, puis je veux récupérer les id_product et id_category de cette table pas encore présents dans la table category_product et les y insérer en calculant leur position dans la catégorie. Voilà pourquoi j'ignore les doublons. Mais la requête que j'ai fait ne fonctionne pas. Une seule ligne est insérée et toutes les autres sont ignorées, même celles qui ne sont pas encore présentes dans la table category_product.

    Voilà j'espère avoir été clair.

    Merci d'avance pour votre aide

Discussions similaires

  1. Requete deffectueuse Insert avec select
    Par Dargos dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2007, 13h58
  2. [EJB3][HIBERNATE] Probleme avec select max
    Par kristof_machin dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/04/2006, 13h05
  3. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  4. Insert avec select
    Par Alexandre` dans le forum Langage SQL
    Réponses: 11
    Dernier message: 25/01/2005, 15h16
  5. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 14h39

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