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

MySQL Discussion :

Liste d'id avec duplications [MySQL-5.6]


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    developpeur Web junior
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : developpeur Web junior
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 13
    Points
    13
    Par défaut Liste d'id avec duplications
    Bonjour, je suis débutant en SQL, et je bloque sur un sujet. Je souhaite effectuer la requête du type suivant :
    SELECT id, nom FROM table WHERE id IN (1,2,3,1,4,5,1)
    La liste des id comporte des doublons et c'est ce que je souhaite. Seulement j'obtiens le retour suivant :
    1, A
    2, B
    3, C
    4, D
    5, E
    Au lieu de
    1, A
    2,B
    3, C
    1, A
    4, D
    5, E
    1, A

    Je pense que j'ai du louper un épisode sur mes cours de SQL pouvez vous m'aiguiller svp ?
    Merci

  2. #2
    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 Ylaro.

    Bonne année 2016, bonne santé, mes meilleurs vœux !

    Non, le résultat que tu obtiens est tout à fait normal. Pourquoi ? MySql lit la table depuis le début jusqu'à la fin.
    A chaque ligne, il vérifie si la valeur contenue dans la colonne 'id' est présente dans la liste que tu donnes.

    Il est inutile de dupliquer tes identifiants dans ta clause where, car cela ne sert à rien :
    tu devras mettre plutôt ceci :
    Au lieu de nous indiquer ton problème, dit nous ce que tu cherches à faire avec un jeu d'essai et le descriptif de ta table.

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

  3. #3
    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
    Citation Envoyé par Ylaro Voir le message
    SELECT id, nom FROM table WHERE id IN (1,2,3,1,4,5,1)
    Seulement j'obtiens le retour suivant [. . .] au lieu de
    1, A
    2, B
    3, C
    1, A
    4, D
    5, E
    1, A
    Comme l'a indiqué Artémus 24, inutile de répéter les valeurs identiques dans votre liste in

    Citation Envoyé par Artemus24 Voir le message
    Non, le résultat que tu obtiens est tout à fait normal. Pourquoi ? MySql lit la table depuis le début jusqu'à la fin.
    A chaque ligne, il vérifie si la valeur contenue dans la colonne 'id' est présente dans la liste que tu donnes.
    MySQL lit toute la table certes, mais la requête fournie par Ylaro n'utilisant ni DISTINCT ni GROUP BY, devrait bien restituer par exemple 3 lignes "id=1, nom=A" or ce n'est pas le cas
    Donc soit la requête fournie par ylaro n'est pas celle qu'il a exécutée, soit le contenu de la table n'est pas celui attendu

  4. #4
    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 Escartefigue.

    Citation Envoyé par Escartefigue
    MySQL lit toute la table certes, mais la requête fournie par Ylaro n'utilisant ni DISTINCT ni GROUP BY, devrait bien restituer par exemple 3 lignes "id=1, nom=A" or ce n'est pas le cas
    Je suis partie de l'idée que sa table était faite dans les règles. J'ai répondu que le comportement était tout à fait normal.
    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
    --------------
    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` (
      `id`   tinyint unsigned auto_increment NOT NULL PRIMARY KEY,
      `nom`  char(10)                        NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`nom`) values
      ('A'),('B'),('C'),('D'),('E')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-----+
    | id | nom |
    +----+-----+
    |  1 | A   |
    |  2 | B   |
    |  3 | C   |
    |  4 | D   |
    |  5 | E   |
    +----+-----+
    --------------
    select *
    from test
    where id IN (1,2,3,1,4,5,1)
    --------------
     
    +----+-----+
    | id | nom |
    +----+-----+
    |  1 | A   |
    |  2 | B   |
    |  3 | C   |
    |  4 | D   |
    |  5 | E   |
    +----+-----+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je ne pense pas que la table soit en cause dans ce qu'il cherche à faire.

    Citation Envoyé par Escartefigue
    Donc soit la requête fournie par ylaro n'est pas celle qu'il a exécutée, soit le contenu de la table n'est pas celui attendu
    Ou soit il s'attendait à ce que le 'IN' donne la liste des lignes dans l'ordre indiquée.
    Comme il est débutant, il se peut qu'il ignore comme fonctionne mysql.

    En partant de la table que j'ai donnée ci-dessus en exemple, je ne sais même pas si en MySql, on peut produire un résultat comme il l'attend.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    developpeur Web junior
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : developpeur Web junior
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 13
    Points
    13
    Par défaut Merci Artemus24 et Escartefigue
    Bonne année et meilleurs voeux pour 2016

    Merci à vous deux pour vos réponses. Mon problème, concrètement, est le suivant. Je veux établir la carte d'une pizzeria en récupérant les données en BDD via une unique requête.

    Ma base de données présente 3 tables :
    Pizzas (champs id et nom)
    Ingrédients (champs id et nom)
    Ingrédients_Pizzas (champs id, pizza_id et ingrédient_id)

    Une pizzas possède plusieurs ingrédients et un ingrédient appartient à plusieurs pizzas.

    Ma requête est la suivante :

    SELECT nom FROM Ingrédients WHERE id IN (
    SELECT ingrédient_id FROM Ingrédient_Pizzas WHERE pizza_id IN (
    SELECT id FROM Pizzas
    )
    )

    Les deux SELECT centraux me fournissent donc une liste d'id avec des doublons, ce qui est normal. Seulement ma requête se comporte comme s'Il y avait un DISTINCT, ce qui ne convient pas à ce que je veux faire.

    Je souhaite bien récupérer les ingrédients de tous les id de la liste, même avec les doublons.

    Merci pour votre aide

  6. #6
    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 Ylaro.

    Plus aucun rapport avec la question d'origine.

    Je me suis inspiré de ce lien : http://www.alsoledo.fr/pizzas.php
    pour la composition des pizzas.

    Voici le résultat de ce que tu désires faire :
    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
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    --------------
    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 `pizza`
    --------------
     
    --------------
    create table `pizza` (
      `id`    integer unsigned auto_increment NOT NULL PRIMARY KEY,
      `nom`   varchar(255)                    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `pizza` (`nom`) values
      ('Regina'),
      ('Margarita'),
      ('Verona')
    --------------
     
    --------------
    select * from pizza
    --------------
     
    +----+-----------+
    | id | nom       |
    +----+-----------+
    |  1 | Regina    |
    |  2 | Margarita |
    |  3 | Verona    |
    +----+-----------+
    --------------
    DROP TABLE IF EXISTS `ingredient`
    --------------
     
    --------------
    create table `ingredient` (
      `id`       integer unsigned auto_increment NOT NULL PRIMARY KEY,
      `element`  char(20)                        NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `ingredient` (`element`) values
      ('tomate'),('fromage'),('oeuf'),('origan'),('champignon'),('jambon'),('lardons'),('poivre vert')
    --------------
     
    --------------
    select * from ingredient
    --------------
     
    +----+-------------+
    | id | element     |
    +----+-------------+
    |  1 | tomate      |
    |  2 | fromage     |
    |  3 | oeuf        |
    |  4 | origan      |
    |  5 | champignon  |
    |  6 | jambon      |
    |  7 | lardons     |
    |  8 | poivre vert |
    +----+-------------+
    --------------
    DROP TABLE IF EXISTS `composition`
    --------------
     
    --------------
    create table `composition` (
      `pizza`        integer unsigned NOT NULL,
      `ingredient`   integer unsigned NOT NULL,
      PRIMARY KEY (`pizza`,`ingredient`),
      CONSTRAINT `FK_PIZZA`      FOREIGN KEY (`pizza`)      REFERENCES `pizza`      (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `FK_INGREDIENT` FOREIGN KEY (`ingredient`) REFERENCES `ingredient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `composition` (`pizza`,`ingredient`) values
      (1, 1), (1, 2), (1, 3), (1, 4),
      (2, 1), (2, 2), (2, 5), (2, 6), (2, 4),
      (3, 1), (3, 5), (3, 6), (3, 2), (3, 7), (3, 8)
    --------------
     
    --------------
    select * from composition
    --------------
     
    +-------+------------+
    | pizza | ingredient |
    +-------+------------+
    |     1 |          1 |
    |     2 |          1 |
    |     3 |          1 |
    |     1 |          2 |
    |     2 |          2 |
    |     3 |          2 |
    |     1 |          3 |
    |     1 |          4 |
    |     2 |          4 |
    |     2 |          5 |
    |     3 |          5 |
    |     2 |          6 |
    |     3 |          6 |
    |     3 |          7 |
    |     3 |          8 |
    +-------+------------+
    --------------
    select p.nom,
           i.element
    from       composition as c
     
    inner join pizza       as p
    on p.id = c.pizza
     
    inner join ingredient  as i
    on i.id = c.ingredient
     
    order by p.nom,
             i.element
    --------------
     
    +-----------+-------------+
    | nom       | element     |
    +-----------+-------------+
    | Margarita | champignon  |
    | Margarita | fromage     |
    | Margarita | jambon      |
    | Margarita | origan      |
    | Margarita | tomate      |
    | Regina    | fromage     |
    | Regina    | oeuf        |
    | Regina    | origan      |
    | Regina    | tomate      |
    | Verona    | champignon  |
    | Verona    | fromage     |
    | Verona    | jambon      |
    | Verona    | lardons     |
    | Verona    | poivre vert |
    | Verona    | tomate      |
    +-----------+-------------+
    --------------
    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

  7. #7
    Membre à l'essai
    Homme Profil pro
    developpeur Web junior
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : developpeur Web junior
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 13
    Points
    13
    Par défaut Merci Artemus24
    Merci beaucoup pour ta réponse. C'est effectivement ce que je recherchais

    Toutefois, je me demande pourquoi on ne peut pas avoir une liste de noms correspondant à une liste d'id avec duplicatats. Pour ma culture personnelle

    Je serai ravi d'En discuter avec vous à l'occasion.

    Bonne continuation

  8. #8
    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 Ylaro.

    Si tu es satisfait, tu mets '+1' à tous ceux qui ont participé à la discussion et tu clôtures ton sujet. C'est la récompense.

    Citation Envoyé par Ylaro
    Toutefois, je me demande pourquoi on ne peut pas avoir une liste de noms correspondant à une liste d'id avec duplicatas. Pour ma culture personnelle
    Ce que tu demandes, cela se traduit par un produit cartésien. La table 'composition' est ce produit cartésien !

    Pourquoi ne peut avoir de duplicatas ?
    C'est une des contraintes de la définition d'une table, surtout quand il s'agit d'un identifiant. Celui-ci doit être unique et non null.

    En fait, il y a presque toujours une solution quand on veut modéliser des relations entre différentes tables.

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    developpeur Web junior
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : developpeur Web junior
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup pour votre aide

    @ +

  10. #10
    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 Ylaro.

    Si vous avez des problèmes de compréhensions ou de faisabilité, je reste à votre disposition.
    Mais pour la prochaine fois, n'oubliez pas de lire ceci : http://www.developpez.net/forums/a69...gage-sql-lire/
    Il vaut mieux expliquer correctement votre problème en donnant les tables, le jeu d'essai, ce que vous avez tenté de faire et ce que vous désirez obtenir au final.
    Autrement dit, rentrer dans le vif du sujet.

    Si vous avez été satisfait, n'oubliez pas de mettre un '+1' sur toutes les messages de tous les participants de ce sujet. Merci !

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

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

Discussions similaires

  1. liste fichiers (TListView) avec icones
    Par pjb dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2005, 09h06
  2. Réponses: 16
    Dernier message: 07/04/2005, 11h36
  3. Comment initialiser une liste de composants avec une boucle ?
    Par EricSid dans le forum Composants VCL
    Réponses: 5
    Dernier message: 06/04/2005, 18h46
  4. Utilisation de la classe List de STL avec wxWidgets
    Par aoyou dans le forum wxWidgets
    Réponses: 7
    Dernier message: 10/03/2005, 17h41
  5. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 11h56

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