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 :

Count sur une requete


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Par défaut Count sur une requete
    Bonjour,

    Pfiou, je sens que mon cas va être difficile à résumer...
    J'ai une requête qui ressemble à ça, que je nomme requete1 (voir à la fin du post) :

    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
    SELECT element, count(element) AS nb 
    FROM compound 
    WHERE element IN 
    ( 
        SELECT element 
        FROM compound 
        WHERE single IN 
        ( 
            SELECT id FROM single 
            WHERE element IN 
            (
                SELECT id 
                FROM element_name 
                WHERE name IN ("element1","element2") 
            )
        ) 
        GROUP BY element 
        HAVING count(element) = 2
    ) 
    GROUP BY element 
    HAVING nb=2;
    Elle me permet de savoir si un mélange de deux éléments ("element1" et "element2") existe dans ma base.
    Je peux aussi la lancer avec deux autres éléments, element3 et element4...

    Le résultat de la requête est ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +----------+----+
    | element  | nb |
    +----------+----+
    | 374      |  2 |
    +----------+----+
    1 row in set (0.00 sec)
    -> j'ai un seul mélange (d'id 374) qui contient à la fois element1 et element2 (nb=2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +---------+----+
    | element | nb |
    +---------+----+
    | 340     |  2 |
    | 447     |  2 |
    +------- -+----+
    2 rows in set (0.00 sec)
    -> j'ai deux mélanges (d'id 340 et 447) qui contient à la fois element3 et element4 (nb=2)

    Ce qui m'intéresse ici c'est donc de récupérer le résultat du nombre de row de chaque requête donc "1 row" pour la première et "2 rows" pour la seconde.
    Je n'arrive pas à ajouter un "count" sur la requête de base pour compter ce nombre de row.
    Du coup je suis passé par une vue et cela fonctionne mais cela me semble un peu lourd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create view v as select element, count(element) as nb from compound where element in ( select element from compound where single in ( select id from single where element in (select id from element_name where name in ("element1","element2") )) group by element having count(element)=2) group by element having nb=2;
    select count(*) from v ;
    drop view v ;
    Dans le premier cas j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (2.89 sec)
    et dans le second :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +----------+
    | count(*) |
    +----------+
    |        2 |
    +----------+
    1 row in set (2.92 sec)
    ce qui est parfait !!!
    une idée pour faire le count directement dans ma requete1 ?
    j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count (*) (requete1) ;
    mais j'ai une erreur de syntaxe...

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Connais-tu la clause WITH ROLLUP de GROUP BY ?
    Par ailleurs je pense que, plutôt qu'avec des sous-requêtes comme argument d'opérateurs IN, les performances seraient meilleures avec des jointures externes.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    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
    Apparemment, fabrice91, tu as besoin d'apprendre les jointures !
    Au passage, les valeurs textuelles s'écrivent entre apostrophes et pas entre guillemets.

    Les trois sous-requêtes de ta requête donneraient semble t-il ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c.element
    FROM compoud c
    INNER JOIN single s ON s.id = c.single
        INNER JOIN element_name en ON s.element = en.id
    WHERE en.name IN ('element1', 'element2') 
    GROUP BY c.element 
    HAVING count(c.element) = 2
    Vu que c'est déjà groupé par élément, pourquoi groupes-tu de nouveau par élément dans ta requête principale ?
    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 !

  4. #4
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Connais-tu la clause WITH ROLLUP de GROUP BY ?
    Par ailleurs je pense que, plutôt qu'avec des sous-requêtes comme argument d'opérateurs IN, les performances seraient meilleures avec des jointures externes.
    Je ne connais pas WITH ROLLUP, j'ai regardé un peu mais je ne vois pas en quoi cela peux me servir...
    Pour les jointures, je suis on ne peux plus d'accord...

    Citation Envoyé par CinePhil Voir le message
    Apparemment, fabrice91, tu as besoin d'apprendre les jointures !
    J'ai appris SQL à une époque où les jointures n'existaient pas, puis je n'ai plus utilisé SQL pendant longtemps, je m'y remets depuis quelques temps mais j'ai du mal avec les jointures, je trouve plus claires mes imbrications !
    Mais bon, j'ai déjà commencé à migrer des requêtes en jointures donc je m'y mets petit à petit...

    Citation Envoyé par CinePhil Voir le message
    Les trois sous-requêtes de ta requête donneraient semble t-il ceci:
    Humph, pas tout à fait, au lieu d'avoir 2 rows pour un de mes exemples, j'en ai 3 et le troisième correspond à priori à celui qui est supprimé avec mon deuxième group by...

  5. #5
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par fabrice91 Voir le message
    Je ne connais pas WITH ROLLUP, j'ai regardé un peu mais je ne vois pas en quoi cela peux me servir....
    Justement à faire le comptage global que tu demandais.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Justement à faire le comptage global que tu demandais.
    Ah ok mais d'après ce que j'ai vu, cela sors sous forme d'une ligne supplémentaire donc si j'ai 2 rows normalement, en ajoutant le WITH ROLLUP j'aurai une ligne supplémentaire indiquant le nombre de rows...
    mais cette solution ne me donne pas DIRECTEMENT par le select lui-même le nombre de rows...

  7. #7
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Par défaut
    bon alors voilà une petit analogie :
    3 tables :
    element_name (id int, name varchar)
    single (id int, name varchar)
    assemblage (id int, element_name_id int, single_id int) avec element_name_id et single_id des clés étrangères sur les id respectivement des tables element_name et single.

    Exemple d'element_name : skateboard, voiture, moto, velo
    Exemple de single : guidon, volant, roue, frein, porte

    Je vais avoir comme "assemblage"s :
    skateboard/roue
    velo/roue
    velo/frein
    velo/guidon
    moto/roue
    moto/frein
    moto/guidon
    voiture/roue
    voiture/frein
    voiture/volant
    voiture/porte

    La question posée par ma requête est :
    - combien de "assemblage" sont constitués EXACTEMENT de roue+frein+guidon :réponse = 2 (velo et moto)
    - combien de "assemblage" sont constitués EXACTEMENT de roue : réponse = 1 (skateboard)

Discussions similaires

  1. Plusieurs count sur une requete avec INNER JOIN
    Par Guizmo95 dans le forum Requêtes
    Réponses: 0
    Dernier message: 22/08/2013, 19h30
  2. COUNT(*) sur une sous requete
    Par knuck dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/09/2010, 17h17
  3. Réponses: 1
    Dernier message: 28/03/2007, 12h23
  4. [Oracle] aide sur une requète dans un count
    Par d_token dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/09/2006, 15h32
  5. []débogage sur une requête dasn visual basic
    Par mcay dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 24/09/2003, 09h59

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