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 :

Un petit casse tete de SELECTION


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Un petit casse tete de SELECTION
    Je possede deux tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BILLETS
     
    SEQ         TKTNUMBER       TKTNAME       
    1001        50000001          DUPONT/A
    1002        50000002          DUPONT/A
    1003        50000003          DUPONT/A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PASSAGERS
    ID_P        PAXNAME               PAXPRICE  
    158         DUPONT/AMELIE     600
    159         DUPONT/ALFRED     700
    160         DUPONT/ANATOLE   600



    Je fais une selection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT b.*, p.*
    FROM billets b, passagers p
    WHERE SUBSTR(b.PAXNAME,1,8) LIKE t.TKTNAME

    J'aurais ce resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1001        50000001          DUPONT/A     158         DUPONT/AMELIE     600
    1001        50000001          DUPONT/A     159         DUPONT/ALFRED     700
    1001        50000001          DUPONT/A     160         DUPONT/ANATOLE   600
    1002        50000002          DUPONT/A     158         DUPONT/AMELIE     600
    1002        50000002          DUPONT/A     159         DUPONT/ALFRED     700
    1002        50000002          DUPONT/A     160         DUPONT/ANATOLE   600
    1003        50000003          DUPONT/A     158         DUPONT/AMELIE     600
    1003        50000003          DUPONT/A     159         DUPONT/ALFRED     700
    1003        50000003          DUPONT/A     160         DUPONT/ANATOLE   600
    J'aimerai avoir ceci comme resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1001        50000001          DUPONT/A     158         DUPONT/AMELIE     600
    1002        50000002          DUPONT/A     159         DUPONT/ALFRED     700
    1003        50000003          DUPONT/A     160         DUPONT/ANATOLE   600

  2. #2
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    Bonjour sharukan,
    Pourquoi le BILLET 1001 ne devrait être lié qu'au PASSAGER 158 et non au 3 PASSAGER ?

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Pour la petite explication :

    - un billet est unique pour chaque passager
    - l'extraction de ma base de donnée de BILLET me donne juste les 8 premiers caracteres du nom du BILLET (b.TKTNAME)
    - je me retrouve bien embeter quand les 8 premiers caractères du nom sont les meme ( DUPONT/AMELIE, DUPONT/ALFRED, DUPONT/ANATOLE)

    Les billets sont associés par ordre d'arrivée des passagers

  4. #4
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    si tu n'a aucun élément en base pour associer un billet à une personne ça va être compliqué..

  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 à tous.

    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
    --------------
    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 `billets`
    --------------
     
    --------------
    CREATE TABLE `billets`
    ( `seq`        INTEGER UNSIGNED  NOT NULL PRIMARY KEY,
      `tktnumber`  INTEGER UNSIGNED  NOT NULL,
      `tktname`    VARCHAR(255)      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `billets` (`seq`,`tktnumber`,`tktname`) values
      (1001, 50000001, 'dupont/a'),
      (1002, 50000002, 'dupont/a'),
      (1003, 50000002, 'dupont/a')
    --------------
     
    --------------
    select * from `billets`
    --------------
     
    +------+-----------+----------+
    | seq  | tktnumber | tktname  |
    +------+-----------+----------+
    | 1001 |  50000001 | dupont/a |
    | 1002 |  50000002 | dupont/a |
    | 1003 |  50000002 | dupont/a |
    +------+-----------+----------+
    --------------
    DROP TABLE IF EXISTS `passagers`
    --------------
     
    --------------
    CREATE TABLE `passagers`
    ( `id_p`      INTEGER UNSIGNED NOT NULL PRIMARY KEY,
      `paxname`   CHAR(255)        NOT NULL,
      `paxprice`  DECIMAL(15,2)    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `passagers` (`id_p`,`paxname`,`paxprice`) values
      (158, 'DUPONT/AMELIE',  600.00),
      (159, 'DUPONT/ALFRED',  700.00),
      (160, 'DUPONT/ANATOLE', 600.00)
    --------------
     
    --------------
    select * from `passagers`
    --------------
     
    +------+----------------+----------+
    | id_p | paxname        | paxprice |
    +------+----------------+----------+
    |  158 | DUPONT/AMELIE  |   600.00 |
    |  159 | DUPONT/ALFRED  |   700.00 |
    |  160 | DUPONT/ANATOLE |   600.00 |
    +------+----------------+----------+
    --------------
    select      *
          from  `passagers` as p
     
    inner join  `billets` as b
            on  b.tktname = left(p.paxname, 8)
    --------------
     
    +------+----------------+----------+------+-----------+----------+
    | id_p | paxname        | paxprice | seq  | tktnumber | tktname  |
    +------+----------------+----------+------+-----------+----------+
    |  158 | DUPONT/AMELIE  |   600.00 | 1001 |  50000001 | dupont/a |
    |  159 | DUPONT/ALFRED  |   700.00 | 1001 |  50000001 | dupont/a |
    |  160 | DUPONT/ANATOLE |   600.00 | 1001 |  50000001 | dupont/a |
    |  158 | DUPONT/AMELIE  |   600.00 | 1002 |  50000002 | dupont/a |
    |  159 | DUPONT/ALFRED  |   700.00 | 1002 |  50000002 | dupont/a |
    |  160 | DUPONT/ANATOLE |   600.00 | 1002 |  50000002 | dupont/a |
    |  158 | DUPONT/AMELIE  |   600.00 | 1003 |  50000002 | dupont/a |
    |  159 | DUPONT/ALFRED  |   700.00 | 1003 |  50000002 | dupont/a |
    |  160 | DUPONT/ANATOLE |   600.00 | 1003 |  50000002 | dupont/a |
    +------+----------------+----------+------+-----------+----------+
    --------------
    select      *
          from  `passagers` as p
     
    inner join  `billets` as b
            on  b.seq = id_p + 843
    --------------
     
    +------+----------------+----------+------+-----------+----------+
    | id_p | paxname        | paxprice | seq  | tktnumber | tktname  |
    +------+----------------+----------+------+-----------+----------+
    |  158 | DUPONT/AMELIE  |   600.00 | 1001 |  50000001 | dupont/a |
    |  159 | DUPONT/ALFRED  |   700.00 | 1002 |  50000002 | dupont/a |
    |  160 | DUPONT/ANATOLE |   600.00 | 1003 |  50000002 | dupont/a |
    +------+----------------+----------+------+-----------+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    On peut toujours trouver une solution à un problème.
    Sauf que vous avez un problème de modélisation dans votre base de données.
    Et donc, même si ma solution correspond à ce que vous attendez, elle sera nécessairement fausse. Pourquoi ?
    Car vous ne savez pas si la ligne 1001 de billets correspond à Amélie, Alfred ou Anatole Dupont.

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

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Merci pour ton aide Arthemus

    Effectivement je ne saurai pas si la ligne 1001 de billets correspond à 100% à Amélie, Alfred ou Anatole Dupont.
    Mon extraction de données de tktname est limité à 8 caractères, donc je vais devoir faire une reverification manuel, mais la plupart du temps l'ordre d'arrivée des entrées TICKETS correspondent à l'ordre d'arrivée des entrées PASSAGERS

    par contre j'ai oublié de signaler que BILLETS.SEQ et PASSAGER.ID_P sont des nombres qui ne se suivent pas forcément.
    je pourrais tout a faire avoir ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +------+----------------+----------+------+-----------+----------+
    | id_p | paxname        | paxprice | seq  | tktnumber | tktname  |
    +------+----------------+----------+------+-----------+----------+
    |  158 | DUPONT/AMELIE  |   600.00 | 1001 |  50000001 | dupont/a |
    |  179 | DUPONT/ALFRED  |   700.00 | 1012 |  50000002 | dupont/a |
    |  195 | DUPONT/ANATOLE |   600.00 | 1013 |  50000002 | dupont/a |
    +------+----------------+----------+------+-----------+----------+

    donc la fonction proposé avec un chiffre fixe ne fonctionnerais pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select      *
          from  `passagers` as p
     
    inner join  `billets` as b
            on  b.seq = id_p + 843

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Y aurait il une fonction qui pourrait faire ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
    (SELECT * FROM PASSAGER ORDER by id_p),
    (SELECT * FROM TICKETS ORDER by seq)
    WHERE 
    "les numero de lignes resultat de chaque SELECT correspondent"

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    DAns d'autres SGBD, il y a la fonction Rownum. Sous MySql, Rownum n'existe pas, mais en cherchant Mysql Rownum, tu vas trouver comment contourner cela.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    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 à tous.

    Il aurait fallu être plus précis dans l'énoncé de votre problème.

    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
    --------------
    select      *
          from  `passagers` as p
     
    inner join  `billets` as b
            on  b.seq = case id_p when 158 then 1001
                                  when 159 then 1003
                                  when 160 then 1002
                                  else 0 end
    --------------
     
    +------+----------------+----------+------+-----------+----------+
    | id_p | paxname        | paxprice | seq  | tktnumber | tktname  |
    +------+----------------+----------+------+-----------+----------+
    |  158 | DUPONT/AMELIE  |   600.00 | 1001 |  50000001 | dupont/a |
    |  160 | DUPONT/ANATOLE |   600.00 | 1002 |  50000002 | dupont/a |
    |  159 | DUPONT/ALFRED  |   700.00 | 1003 |  50000003 | dupont/a |
    +------+----------------+----------+------+-----------+----------+
    J'espère pour vous que la liste des identifiants ne se résume pas à un annuaire téléphonique.
    Avec le case, vous avez la possibilité de choisir l'ordre d'attribution de vos identifiants.

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

Discussions similaires

  1. petit casse tete avec des case à cocher
    Par moumous24 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/07/2010, 16h14
  2. SQL Casse tete selection regroupe
    Par cgregueusse dans le forum Langage SQL
    Réponses: 8
    Dernier message: 15/09/2008, 13h26
  3. [RegEx] Petit casse tete amusant [niveau debutant]
    Par rodeo_fly dans le forum Langage
    Réponses: 6
    Dernier message: 12/09/2007, 16h20
  4. Eliminer une boucle for. (Petit casse tete)
    Par zicos dans le forum MATLAB
    Réponses: 8
    Dernier message: 23/05/2007, 11h53
  5. [casse-tete (pour moi)] recuperer la largeur d'un <div>
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 05/11/2004, 07h39

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