Discussion: Insert ou Select ?

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : novembre 2009
    Messages : 18
    Points : 13
    Points
    13

    Par défaut Insert ou Select ?

    Bonjour,
    J'ai un souci Mysql, et je ne maitrise pas encore bien la syntaxe et la logique de ce language surpuissant.
    Le problème est le suivant :

    ma_table =

    3 colonnes :

    product_id
    shooper_group_id
    product_price

    les valeurs :

    product_id shopper_group_id product_price
    1 5 10
    1 7 10
    2 5 22
    2 7 22
    3 5 96
    4 5 22
    5 5 85
    6 5 183
    ...
    1520 5 54
    ...etc...

    Je cherche soit une formule pour INSERT des lignes avec product_id = product_id, shopper_group_id = "7", product_price = product_price uniquement si
    le rapport product_id et shopper_group_id = "5" et si on ne retrouve pas ce rapport égal à "7" de facon à obtenir cela :


    product_id shopper_group_id product_price
    1 5 10
    1 7 10
    2 5 22
    2 7 22
    3 5 96
    3 7 96
    4 5 22
    4 7 22
    5 5 85
    5 7 85
    6 5 183
    6 7 183
    ...
    1520 5 54
    1520 7 54
    ...etc...

    Ou, Soit, une formule SELECT pour isoler le rapport product_id et shopper_group_id = "5" ( et pas celui ou on trouve "5" et "7") pour obtenir cela :

    product_id shopper_group_id product_price

    3 5 96
    4 5 22
    5 5 85
    6 5 183
    ...
    1520 5 54
    ...etc...

    On fait comment SVP

  2. #2
    Expert éminent Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    2 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 2 719
    Points : 8 218
    Points
    8 218

    Par défaut

    Salut melix1.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `product_id`        integer unsigned not null auto_increment,
      `shooper_group_id`  integer unsigned not null,
      `product_price`     integer unsigned not null,
      primary key (`product_id`,`shooper_group_id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`product_id`,`shooper_group_id`,`product_price`) values
      (1,5,10),(1,7,10),(2,5,22),(2,7,22),(3,5,96),(4,5,22),(5,5,85),(6,5,183),(1520,5,54)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +------------+------------------+---------------+
    | product_id | shooper_group_id | product_price |
    +------------+------------------+---------------+
    |          1 |                5 |            10 |
    |          1 |                7 |            10 |
    |          2 |                5 |            22 |
    |          2 |                7 |            22 |
    |          3 |                5 |            96 |
    |          4 |                5 |            22 |
    |          5 |                5 |            85 |
    |          6 |                5 |           183 |
    |       1520 |                5 |            54 |
    +------------+------------------+---------------+
    --------------
    select  *
      from  test as t1
     where  shooper_group_id = 5
       and not exists ( select  1
                          from  test as t2
                         where  t2.product_id       = t1.product_id
                           and  t2.shooper_group_id = 7
                      )
    --------------
     
    +------------+------------------+---------------+
    | product_id | shooper_group_id | product_price |
    +------------+------------------+---------------+
    |          3 |                5 |            96 |
    |          4 |                5 |            22 |
    |          5 |                5 |            85 |
    |          6 |                5 |           183 |
    |       1520 |                5 |            54 |
    +------------+------------------+---------------+
    --------------
    insert into  test (`product_id`,`shooper_group_id`,`product_price`)
      select  product_id, 7 as shooper_group_id, product_price
        from  test as t1
       where  shooper_group_id = 5
         and  not exists ( select  1
                             from  test as t2
                            where  t2.product_id       = t1.product_id
                              and  t2.shooper_group_id = 7
                         )
    --------------
     
    --------------
    select * from test
    --------------
     
    +------------+------------------+---------------+
    | product_id | shooper_group_id | product_price |
    +------------+------------------+---------------+
    |          1 |                5 |            10 |
    |          1 |                7 |            10 |
    |          2 |                5 |            22 |
    |          2 |                7 |            22 |
    |          3 |                5 |            96 |
    |          3 |                7 |            96 |
    |          4 |                5 |            22 |
    |          4 |                7 |            22 |
    |          5 |                5 |            85 |
    |          5 |                7 |            85 |
    |          6 |                5 |           183 |
    |          6 |                7 |           183 |
    |       1520 |                5 |            54 |
    |       1520 |                7 |            54 |
    +------------+------------------+---------------+
    --------------
    truncate test
    --------------
     
    --------------
    insert into `test` (`product_id`,`shooper_group_id`,`product_price`) values
      (1,5,10),(1,7,10),(2,5,22),(2,7,22),(3,5,96),(4,5,22),(5,5,85),(6,5,183),(1520,5,54)
    --------------
     
    --------------
    insert ignore into test (`product_id`,`shooper_group_id`,`product_price`)
      select  product_id, 7 as shooper_group_id, product_price
        from  test
       where  shooper_group_id = 5
    --------------
     
    --------------
    select * from test
    --------------
     
    +------------+------------------+---------------+
    | product_id | shooper_group_id | product_price |
    +------------+------------------+---------------+
    |          1 |                5 |            10 |
    |          1 |                7 |            10 |
    |          2 |                5 |            22 |
    |          2 |                7 |            22 |
    |          3 |                5 |            96 |
    |          3 |                7 |            96 |
    |          4 |                5 |            22 |
    |          4 |                7 |            22 |
    |          5 |                5 |            85 |
    |          5 |                7 |            85 |
    |          6 |                5 |           183 |
    |          6 |                7 |           183 |
    |       1520 |                5 |            54 |
    |       1520 |                7 |            54 |
    +------------+------------------+---------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : novembre 2009
    Messages : 18
    Points : 13
    Points
    13

    Par défaut

    Merci Artemus24,
    On peut dire que tu lui fais faire des loopings à cette table !
    Je me suis trouvé une solution maison avec deux SELECT + export des resultats, puis comparaison dans Calc afin d'extraire le bazar pour faire un INSERT ciblé avec le résultat... un peu galère mais ça marche.
    Par contre, les formules que tu me sers sur plateau d'argent sont bien plus sympa et contribuent à enrichir mon inculture du haut de laquelle je te remercie

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : novembre 2009
    Messages : 18
    Points : 13
    Points
    13

    Par défaut

    wOW trop balaize les jointures à tiroir t1 t2 !!!

  5. #5
    Expert éminent Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    2 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 2 719
    Points : 8 218
    Points
    8 218

    Par défaut

    Salut melix1.

    On nomme cela une sous-requête corrélée.
    --> http://sqlpro.developpez.com/cours/s...usrequetes/#L2

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

Discussions similaires

  1. 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
  2. Insert avec select
    Par Alexandre` dans le forum Langage SQL
    Réponses: 11
    Dernier message: 25/01/2005, 15h16
  3. 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
  4. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL-Server
    Réponses: 5
    Dernier message: 04/11/2004, 17h32
  5. [Insert et Select de la même table]
    Par lucimast dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/01/2004, 14h53

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