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 :

requete avec incrementation et condition


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Par défaut requete avec incrementation et condition
    Bonjour

    je ne sais pas du tout comment faire
    si vous pouvez m'aiguiller ...
    je dois inserer dans cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `categories` (
      `categories_id` int(11) NOT NULL auto_increment,
      `categories_id_ext` varchar(50) NOT NULL,
      `categories_image` varchar(64) default NULL,
      `parent_id` int(11) NOT NULL default '0',
      `sort_order` int(3) default NULL,
      `date_added` datetime default NULL,
      `last_modified` datetime default NULL,
      PRIMARY KEY  (`categories_id`),
      KEY `idx_categories_parent_id` (`parent_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    ces données de la table cctfr:
    A Ordinateurs
    AA Ordinateurs de bureau et Serveurs I01881
    AB Ordinateurs portables I01880
    AC Ordinateurs de poche I01882
    AD Mises à niveau de processeur I01408
    B Mémoires
    BA RAM I01386
    BB Mémoire vidéo I01396
    BC Mémoire cache I01884
    BD Mémoire flash I01885
    sachant que "A" et "B" doivent incrementer "sort_order"
    et que "AA" -> "AK" doivent recuperer le "categories_id" de "A" et l'inserer dans leur "parent_id"

    le resultat que je veux obtenir :
    categories_id categories_id_ext parent_id sort_order
    1 A 0 1
    2 AA 1 0
    3 AB 1 0
    4 AC 1 0
    5 AD 1 0
    6 B 0 2
    7 BA 6 0
    8 BB 6 0
    9 BC 6 0
    10 BD 6 0
    merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Qu'est-ce que tu entends exactement par "incrémenter" ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Par défaut
    sachant que "A" et "B" doivent incrementer "sort_order"
    A = 1 et B = 2 et ainsi de suite
    où `sort_order` int(3) DEFAULT NULL,

    ce code ne fonctionne pas dans phpmyadmin mais c'est à peu pres ce que je voudrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @counter int
    SET @counter = 0
    INSERT INTO categories (categories_id_ext,sort_order,date_added)
    SELECT Id,@counter+1,"$DAY" FROM cnet_cctfr WHERE LENGTH(Id) = 1

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par nicerico Voir le message
    ... et que "AA" -> "AK" doivent recuperer le "categories_id" de "A" et l'inserer dans leur "parent_id"
    c'est la même chose pour BA -> BK ?

    sur quelle table vas-tu chercher le categories_id de A ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Par défaut
    c'est la même chose pour BA -> BK ?
    oui idem et je vais chercher cela sur la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `cnet_cctfr` (
      `Id` varchar(2) NOT NULL,
      `Description` varchar(80) NOT NULL,
      `DefaultImage` varchar(10) NOT NULL,
      KEY `Id` (`Id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    qui correspond à :
    A Ordinateurs
    AA Ordinateurs de bureau et Serveurs I01881
    AB Ordinateurs portables I01880
    AC Ordinateurs de poche I01882
    AD Mises à niveau de processeur I01408
    B Mémoires
    BA RAM I01386
    BB Mémoire vidéo I01396
    BC Mémoire cache I01884
    BD Mémoire flash I01885
    ...
    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    OK. Il faut procéder en deux temps :

    1. insertion des lignes
    2. modification de la parent_id d'après les categories_id attribuées automatiquement à l'étape 1


    Pour la première étape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into categories (categories_id_ext, parent_id, sort_order)
    select id, 
      0,
      CASE WHEN Id = 'A' THEN 1 WHEN Id = 'B' THEN 2 ELSE 0 END
    from cnet_cctfr
    Pour la seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update categories AS C
    set parent_id = (
    	select categories_id 
    	from (select categories_id, categories_id_ext from categories ) AS C2 
    	where C2.categories_id_ext = substring(C.categories_id_ext, 1, 1))
    where C.categories_id_ext NOT IN ('A', 'B')
    Je précise que la sous-sous-requête a pour but de contourner l'interdiction de lire dans la table qu'on est en train de modifier.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Par défaut
    C'est exactement ça sauf à un detail pres qui a son importance
    et que j'ai omis dans mon exemple :
    c'est qu'il existe A, B mais aussi C D E F G H .....
    et donc j'ai besoin d'une boucle pour incrementer le "sort_order"
    sachant aussi que d'autres enregistrements seront inséré dans le table avec un "sort_order" = 0 (ces autres enregistrement sont : AA,AB,AC ... BA,BB,BC ... CA,CB .......)

    pouvons nous dans un requete dire que le champs "sort_order" est autoincrement ? et dans une autre le contraire?

    comme cela avant d'inserer ABCD... je lui dit d'etre autoincrement
    et pour AA BA CA CB ... je lui dit de ne plus etre autoincrement

    desolé d'avoir omis les detail plus haut et encore merci de ton aide

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par nicerico Voir le message
    pouvons nous dans un requete dire que le champs "sort_order" est autoincrement ? et dans une autre le contraire?

    comme cela avant d'inserer ABCD... je lui dit d'etre autoincrement
    et pour AA BA CA CB ... je lui dit de ne plus etre autoincrement
    non, l'auto_increment est sur la table et non sur la requête.

    Citation Envoyé par nicerico Voir le message
    C'est exactement ça sauf à un detail pres qui a son importance
    et que j'ai omis dans mon exemple :
    c'est qu'il existe A, B mais aussi C D E F G H .....
    et donc j'ai besoin d'une boucle pour incrementer le "sort_order"
    sachant aussi que d'autres enregistrements seront inséré dans le table avec un "sort_order" = 0 (ces autres enregistrement sont : AA,AB,AC ... BA,BB,BC ... CA,CB .......)
    De manière générale, les raisonnements par boucle sont à proscrire en bases de données... Dans ton cas, il y beaucoup plus simple : la formule ORD(Id) - 64 te donne 1 pour A, 2 pour B, etc.

    Si je modifie mes requêtes, ça donne donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT INTO categories (categories_id_ext, parent_id, sort_order)
    SELECT id, 
      0,
      CASE WHEN CHAR_LENGTH(Id) = 1 THEN ORD(Id) - 64 ELSE 0 END
    FROM cnet_cctfr ;
     
    UPDATE categories AS C
    SET parent_id = (
    	SELECT categories_id 
    	FROM (SELECT categories_id, categories_id_ext FROM categories ) AS C2 
    	WHERE C2.categories_id_ext = substring(C.categories_id_ext, 1, 1))
    WHERE CHAR_LENGTH(C.categories_id_ext) > 1  ;

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

Discussions similaires

  1. requete avec une double condition
    Par k_boy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/12/2007, 12h04
  2. Requetes Avec Count et condition sur date
    Par Harry dans le forum WinDev
    Réponses: 1
    Dernier message: 04/06/2007, 15h23
  3. Requete avec une condition sur le resultat [10g]
    Par hotkebab99 dans le forum Oracle
    Réponses: 5
    Dernier message: 12/09/2006, 11h33
  4. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18
  5. Requete avec condition
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/06/2005, 09h37

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