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 :

Requête apparemment simple


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut Requête apparemment simple
    Bonjour,

    Je rencontre un petit problème de requête qui me donne bien du mal car en apparence est assez simple mais ne fait pas ce que je veux...

    Explications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Table
    id | catid  | article | aorder | subcatid
    -----------------------------------------
     1 |   1    |    A    |   1    |    0
     2 |   1    |    C    |   2    |    0
     3 |   1    |    D    |   3    |    0
     4 |   2    |    A    |   1    |    0
     5 |   2    |    G    |   2    |    0
     6 |   2    |    M    |   3    |    0
     7 |   2    |    R    |   4    |    0
     8 |   3    |    B    |   1    |    0
     9 |   3    |    C    |   2    |    0
     10|   3    |    -    |   3    |    1
     11|   3    |    P    |   4    |    0
    "catid" représente un groupe et "subcatid" un sous-groupe.
    "aorder" sert juste de compteur pour garder l'ordre.

    Questions :
    Comment fait-on pour obtenir par exemple la catégorie n° 3 avec la sous-catégorie n° 1 en gardant l'ordre comme le résultat que je souhaite avoir ci-dessous ?

    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
    id | catid  | article | aorder | subcatid
    -----------------------------------------
     8 |   3    |    B    |   1    |    0
     9 |   3    |    C    |   2    |    0
     10|   3    |    -    |   3    |    1
     1 |   1    |    A    |   4    |    0
     2 |   1    |    C    |   5    |    0
     3 |   1    |    D    |   6    |    0
     11|   3    |    P    |   7    |    0 
     
    ou
     
    id | catid  | article | aorder | subcatid
    -----------------------------------------
     8 |   3    |    B    |   1    |    0
     9 |   3    |    C    |   2    |    0
     10|   3    |    -    |   3    |    1
     1 |   1    |    A    |   3    |    0
     2 |   1    |    C    |   3    |    0
     3 |   1    |    D    |   3    |    0
     11|   3    |    P    |   4    |    0 
     
    avec "aorder" contenant l'ordre que je souhaite...
    J'ai essayé de retourner le problème dans tous les sens mais je n'arrive pas à trouver la solution pour obtenir cet ordre.
    Est-ce que ma structure n'est pas bonne ou est-ce mon niveau de SQL qui laisse à désirer ?

    Avez-vous une idée ?

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    J'ai du mal à comprendre soit le problème, soit la logique de l'ordre souhaité !

    Si l'ordre est celui qui figure dans la colonne aorder, il suffit de faire le tri sur cette colonne :
    Si la colonne aorder est le résultat du tri et n'est pas une colonne réelle de la table, alors je ne comprends pas pourquoi on commence par la catid 3 puis 1 avant de revenir à la 3.

    Il faudrait expliquer un peu plus en détail la logique du tri à effectuer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Merci pour votre réponse...

    Si je fais une requête telle que celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM table 
    WHERE (catid IN (3, (
      SELECT subcatid 
      FROM table 
      WHERE catid = 3 
        AND subcatid != 0)))
    J'obtiens quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id | catid  | article | aorder | subcatid
    -----------------------------------------
     1 |   1    |    A    |   1    |    0
     2 |   1    |    C    |   2    |    0
     3 |   1    |    D    |   3    |    0
     8 |   3    |    B    |   1    |    0
     9 |   3    |    C    |   2    |    0
     10|   3    |    -    |   3    |    1
     11|   3    |    P    |   4    |    0
    De ce fait, l'ordre est perdu car "aorder" contient des doublons ce qui n'est pas utilisable surtout si je fais un tri sur ce champ...

    Il faudrait pouvoir ajouter un champ qui s'incrémente tout en respectant l'ordre de départ c-à-d comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id | catid  | article | aorder | subcatid
    -----------------------------------------
     8 |   3    |    B    |   1    |    0
     9 |   3    |    C    |   2    |    0
     10|   3    |    -    |   3    |    1
     1 |   1    |    A    |   4    |    0
     2 |   1    |    C    |   5    |    0
     3 |   1    |    D    |   6    |    0
     11|   3    |    P    |   7    |    0
    J'espère que c'est plus clair...

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    D'après le premier tableau, je déduis qu'il faut trier d'abord par catid puis par aorder.
    Auquel cas ce serait simple :
    Mais je ne comprends toujopurs pas la logique de tri du second tableau, surtout que aorder semble avoir changé de valeurs !

    Quant à la requête, je ne suis pas sûr de la comprendre non plus. Il me semble qu'une simple auto-jointure suffirait au lieu de ce WHERE avec sous-requête dans un IN, totalement contre performant !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    En cherchant sur le net, j'ai trouvé ceci sur les auto-jointures :
    http://sqlpro.developpez.com/cours/s...intures/#LIV-C

    Même si je fais une auto-jointure (que je ne connais pas), cela ne résoudra en rien mon problème.

    On ne peut pas se fier à l'ordre de "catid" car il se pourrait très bien que se soit le contraire (catid 1 englobant le catid 3) et là l'ordre ne correspondrait plus du tout.

    Dans les 2 exemples de résultats souhaités, le 1er serait idéal car on ne trierait que sur "aorder" et le 2e exemple serait d'abord trié sur "aorder" puis sur "id" pour obtenir quelque chose de presque cohérent car l'id 10 serait décalé à l'avant dernière place et se serait faux.

    Je vais posé le problème autrement :

    J'enregistre un arbre (structure en arbre) dans une table en le parsant d'un élément à un autre par descendance.
    Exemple d'arbre simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1000
       1x A
       2x B
       1x G
    Exemple d'arbre englobant un autre arbre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1001
       1x D
       3x F
       2x G
            5x 1000
               1x A
               2x B
               1x G
       4x M
    Il peut y avoir plusieurs arbres sous un arbre principal à différents niveaux.

    Le but final est de calculer le nombre d'article "A", "B",... se trouvant dans cette structure... sachant que dans le 2e exemple (arbre "1001") on trouve 5x l'arbre "1000" composé donc de "5x A", "10x B" et "5x G"...

    J'espère que ma description est assez clair.

    En référence à mon problème, j'ai trouvé ceci :
    http://sqlpro.developpez.com/cours/arborescence/
    [ame="http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures"]Trees In The Database - Advanced data structures@@AMEPARAM@@ssplayer2.swf?doc=treesinthedatabase-slideshare-090617144655-phpapp01&stripped_title=trees-in-the-database-advanced-data-structures@@AMEPARAM@@treesinthedatabase-slideshare-090617144655-phpapp01@@AMEPARAM@@trees-in-the-database-advanced-data-structures[/ame]
    http://explainextended.com/2009/09/2...ed-sets-mysql/
    mais rien sur le calcul de quantité...

    La table qui stocke ces données se présente comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE `arttree` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sub_id` int(11) NOT NULL DEFAULT '0',
      `counter` int(11) NOT NULL DEFAULT '0',
      `article_id` int(11) NOT NULL DEFAULT '0',
      `artnr` varchar(30) DEFAULT NULL,
      `quantity` int(11) NOT NULL DEFAULT '0',
      `level` int(11) NOT NULL DEFAULT '0',
      `lft` int(11) NOT NULL DEFAULT '0',
      `rgt` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1304 DEFAULT CHARSET=utf8;
    La plus grande difficulté pour moi est de retrouver la quantité d'un sous-arbre puis d'appliquer cette valeur aux quantités des éléments formant ce sous-arbre.

    Est-ce au moins possible en SQL ??

Discussions similaires

  1. [MySQL] affichage requête dans simple champ texte formulaire
    Par romeskira dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/10/2008, 10h50
  2. Enigme sur deux requêtes apparemment semblables
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 13/02/2008, 14h10
  3. Requête SELECT simple assez longue
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 22/10/2007, 18h28
  4. requête SQL simple
    Par Echizen1 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/09/2006, 14h34
  5. [Débutant] Requête statistique simple
    Par drthodt dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 14/10/2005, 09h50

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