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

Langage SQL Discussion :

SELECT avec 2 niveaux de catégories


Sujet :

Langage SQL

  1. #21
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Je sais que la colonne existe.
    Mais il faut que les lignes existent.

    Seulement 5 si vous voulez.
    Il faut que les valeurs de pos_id existent dans la table position avant de les mettre dans la table machine sinon vous aurez une erreur.

  2. #22
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Petit retour en arrière : je viens d'apprendre une contrainte supplémentaire : ne pas toucher à la table 'machines' (donc 'machinenew' et les clés étrangères, on oublie). Par contre, il reste possible de créer des tables supplémentaires. Et pour info, je peux construire les informations type du serveur et position à partir de la table 'machines'. Pour type du serveur, celle-ci comporte une colonne 'type'. Et pour position, il y a la colonne 'localization'.
    Je pense qu'il y a moyen de faire des select sans clé étrangère, du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select machines.type from machines,serveur_type WHERE machines.type=serveur_type.type
    . Je viens d'essayer et ça fonctionne sauf pour la valeur 'Other...' de la colonne 'type'. Pourquoi ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  3. #23
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Si vous avez tout dans la même table de toute façon, pas besoin de jointure, non ?

    Qu'est-ce que vous voulez faire comme requête ?

  4. #24
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Non, tout n'est pas dans la même table vu qu'il va en rester 3. Pour le moment :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE IF NOT EXISTS `machines` (
      `name` varchar(20) COLLATE latin1_bin DEFAULT NULL,
      `localization` varchar(30) COLLATE latin1_bin DEFAULT NULL,
      `pays` varchar(30) COLLATE latin1_bin NOT NULL DEFAULT '',
      `entite` varchar(20) COLLATE latin1_bin DEFAULT NULL,
      `perimetre` set('Oui','Non') COLLATE latin1_bin DEFAULT NULL,
      `type` varchar(20) COLLATE latin1_bin DEFAULT NULL,
      `id` smallint(6) NOT NULL AUTO_INCREMENT,
      `comment` varchar(100) COLLATE latin1_bin DEFAULT NULL,
      `ip` varchar(15) COLLATE latin1_bin DEFAULT NULL,
      `contact_name` varchar(50) COLLATE latin1_bin DEFAULT NULL,
      `contact_phone` varchar(50) COLLATE latin1_bin DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=427 ;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE IF NOT EXISTS `position` (
      `pos_id` smallint(6) NOT NULL AUTO_INCREMENT,
      `positionX` int(11) DEFAULT NULL,
      `positionY` int(11) DEFAULT NULL,
      PRIMARY KEY (`pos_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ROW_FORMAT=COMPRESSED AUTO_INCREMENT=6 ;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE IF NOT EXISTS `serveur_type` (
      `type_id` smallint(6) NOT NULL AUTO_INCREMENT,
      `type` varchar(100) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`type_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;

    sauf que comme machines est non modifiable, à mon avis jointure impossible, vu que clé étrangère impossible.
    La (ou les) requête(s) à faire doit(vent) permettre d'afficher par position (ou localization) les différents types de machine, et par type les différentes machines.

    Un exemple (simpliste) :

    Grenoble
    ---type1
    ------machine1-1
    ------machine1-2
    ---type2
    ------machine2-1
    ------machine2-2
    ------machine2-3

    Bordeaux
    ---type1
    ------machine1-1
    ;à remarquer le trou entre type1 et type4
    ---type4
    ------machine4-1
    ------machine4-2
    ------machine4-3
    ---type6
    ------machine6-1
    ------machine6-2
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #25
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,
    Citation Envoyé par laurentSc Voir le message
    ne pas toucher à la table 'machines' (donc 'machinenew' et les clés étrangères, on oublie). Par contre, il reste possible de créer des tables supplémentaires.
    Alors vous pourriez créer une table MACHINE_DETAIL, avec comme une clef étrangère référençant la table machine, et qui serait également clef primaire comme dans un cas d'héritage (ou en l'occurrence de partitionnement vertical).
    Si vous avez le droit de créer des tables, alors j’imagine que vous pouvez aussi créer des vues. Vous pouvez alors créer une vue MACHINE_NEW, qui ferait la jointure entre les tables MACHINE et MACHINE_DETAIL.

    Mais dans tous les cas, je pense qu'il faut résoudre votre problème de modélisation avant de penser à résoudre votre problème de requête.

  6. #26
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    merci pour la réponse ; j'avoue être un peu largué étant peu expérimenté en SQL. Néanmoins, j'ai tenté de suivre vos indications, mais ça coince au niveau de la création de la table machine_detail :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table machine_detail (
    id_mach_detail smallint(6) NOT NULL ,
    PRIMARY KEY (`id_mach_detail`),
    constraint `fk_machine` foreign key(`id`)  references `machines`  )
    engine=innoDB
      default charset=latin1 collate=latin1_general_ci


    provoque le message
    La clé 'id' n'existe pas dans la table
    alors que cette colonne existe bien dans la table machines ; comprenez-vous le problème ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #27
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    essayez comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create table machine_detail (
    id_mach_detail smallint(6) NOT NULL ,
    PRIMARY KEY (`id_mach_detail`),
    constraint `fk_machine` foreign key(`id_mach_detail`)  references `machines`(`id`)  )
    engine=innoDB
      default charset=latin1 collate=latin1_general_ci

  8. #28
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Confirmation de mon manque d'expérience en sql ; néanmoins votre requête donne
    #1215 - Impossible d'ajouter des contraintes d'index externe
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  9. #29
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    J'adore la précision des messages d'erreur de MySQL

    d'après votre dernier script, votre table machine utilise MyISAM, il faudrait qu'elle soit en InnoDB pour pouvoir mettre en place les contraintes référentielles.

  10. #30
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Bien vu pour mettre la table en InnoDB.
    Je verrai demain pour la création de la vue (notion que je ne connaissais pas) et le reste.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  11. #31
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    J'avais dit demain : je commence bien mon post samedi mais pas sûr de le finir samedi !

    Je regarde la création de la vue ; en fait, j'ai besoin d'informations de la table machines (name), serveur_type (type) et position (que je viens de changer)(positionX et positionY)

    La nouvelle table position :
    Code sql : 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
     
    CREATE TABLE IF NOT EXISTS `position` (
      `pos_id` smallint(6) NOT NULL AUTO_INCREMENT,
      `positionX` int(11) DEFAULT NULL,
      `positionY` int(11) DEFAULT NULL,
      `localization` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
      PRIMARY KEY (`pos_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ROW_FORMAT=COMPRESSED AUTO_INCREMENT=9 ;
     
    --
    -- Dumping data for table `position`
    --
     
    INSERT INTO `position` (`pos_id`, `positionX`, `positionY`, `localization`) VALUES
    (1, 10, 10, 'Angouleme-Espagnac'),
    (2, 20, 20, 'Bourgebus'),
    (3, 30, 30, 'Grenoble-38EQI');
    pour les enregistrements, j'ai mis n'importe quelles valeurs ; il n'y a que les valeurs de la colonne localization qui sont justes : j'ai pris les 3 1e valeurs de la table machine, l'idée étant que pour chaque localization de la table machines on indique des coordonnées dans la table position.

    Je pense qu'il faut créer une vue qui affichera des lignes du type :
    machine1 type1 10 10
    machine2 type1 20 20
    machine3 type2 10 10
    machine4 type3 10 10
    machine5 type3 30 30
    machine6 type2 30 30
    etc.
    c'est bien ça ? Si oui, je ne vois plus à quoi sert machine_detail...
    Je continuerai demain...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  12. #32
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 374
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Ce matin, j'ai créé une vue :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    create view machines_view (name,type,positionX,positionY) as select machines.name, serveur_type.type,position.positionX,position.positionY from machines,serveur_type,position where serveur_type.type=machines.type and position.localization=machines.localization
    qui semble répondre à mon besoin. Je pense continuer avec cela, mais suis-je dans la bonne voie ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

Discussions similaires

  1. UNION de deux SELECT avec nombre d'arguments différents
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2004, 14h32
  2. Réponses: 6
    Dernier message: 08/06/2004, 14h51
  3. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  4. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 15h21
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

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