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, JOIN et WHERE


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut COUNT, JOIN et WHERE
    Bonjour à tous,

    Est-il possible d'utiliser un WHERE sur un COUNT ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT gene, count(gene) FROM `kp_pairwise_alignments` 
    WHERE count(gene) > 1
    GROUP by gene
    Serait-il possible d'y ajouter des jointures?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT kp.gene, count(kp.gene), kp.Identity,
      k.sequence AS kpneu_seq, k.id AS kpneu_id, k.seq_length AS kpneu_length,
      e.sequence AS Ecol_seq, e.id AS Ecol_id, e.seq_length AS Ecol_length
    FROM test.kp_pairwise_alignments kp
    JOIN test.e_coli_complete_genomes e
    ON kp.Compared_Orga_ID = e.id
    JOIN test.k_pneumoniae_complete_genomes k
    ON kp.K_pneum_ID = k.id
    WHERE count(kp.gene) > 1
    ORDER BY kp.Identity ASC
    Comment puis-je procéder?


    Merci,

  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,
    Citation Envoyé par Jasmine80 Voir le message
    Est-il possible d'utiliser un WHERE sur un COUNT ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT gene, count(gene) FROM `kp_pairwise_alignments` 
    WHERE count(gene) > 1
    GROUP by gene
    Ben, non il faut le mettre dans un HAVING après le GROUP BY. HAVING est à GROUP BY ce que WHERE est à FROM.
    Citation Envoyé par Jasmine80 Voir le message
    Serait-il possible d'y ajouter des jointures?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT kp.gene, count(kp.gene), kp.Identity,
      k.sequence AS kpneu_seq, k.id AS kpneu_id, k.seq_length AS kpneu_length,
      e.sequence AS Ecol_seq, e.id AS Ecol_id, e.seq_length AS Ecol_length
    FROM test.kp_pairwise_alignments kp
    JOIN test.e_coli_complete_genomes e
    ON kp.Compared_Orga_ID = e.id
    JOIN test.k_pneumoniae_complete_genomes k
    ON kp.K_pneum_ID = k.id
    WHERE count(kp.gene) > 1
    ORDER BY kp.Identity ASC
    L'important est de garder la cohérence des résultats, un COUNT sans GROUP BY essayera de compter sur l'ensemble des lignes résultant de la jointure, si ça n'a pas de sens tu risques un message d'erreur et/ou un résultat incohérent. Outre une engueulade de ma part(non, je rigole )
    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
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci beaucoup pour ton aide, la requête fonctionne bien maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT kp.gene, count(kp.gene), kp.Identity, k.id AS kpneu_id, k.seq_length AS kpneu_length, e.id AS Ecol_id, e.seq_length AS Ecol_length
    FROM test.kp_pairwise_alignments kp
    JOIN test.e_coli_complete_genomes e
    ON kp.Compared_Orga_ID = e.id
    JOIN test.k_pneumoniae_complete_genomes k
    ON kp.K_pneum_ID = k.id
    GROUP BY gene
    HAVING count(kp.gene) > 1
    ORDER BY kp.gene ASC
    Néanmoins, ce n'est pas exactement ce que je veux. J'aimerais récupérer les informations des gènes présents en double mais récupérer toutes leurs valeurs et pas juste une seul. Le regroupement devrait donc se faire pour connaître les gènes à récupérer mais il faudrait récupérer toutes les occurrences possibles de ces gènes.

  4. #4
    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
    A partir du moment ou tu fais un GROUP BY, il faut que l'ensemble des colonnes du SELECT garde une cohérence sur chaque ligne regroupée.
    Si certaines colonnes peuvent avoir des valeurs multiples au sein d'un GROUP, tu peux éventuellement utiliser GROUP_CONCAT, pour les rassembler dans une seule colonne.
    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)

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    A partir du moment ou tu fais un GROUP BY, il faut que l'ensemble des colonnes du SELECT garde une cohérence sur chaque ligne regroupée.
    Si certaines colonnes peuvent avoir des valeurs multiples au sein d'un GROUP, tu peux éventuellement utiliser GROUP_CONCAT, pour les rassembler dans une seule colonne.
    L'ennui est qu'elles peuvent toutes avoir des valeurs multiples, je devrais donc utiliser GROUP_CONCAT sur tous les autres champs récupérer.

    J'avoue, j'ai un peu triché, mais j'ai réussi à récupérer la liste des gènes dont count(kp.gene) est > 2 via un programme en Perl, cela va simplifier ma requête.


    Merci beaucoup pour ton aide,

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

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. INNER JOIN ou WHERE
    Par Thierry8 dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/02/2006, 16h45
  3. Jointures : INNER JOIN vs WHERE
    Par vic dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/02/2006, 11h05
  4. INNER JOIN et WHERE...=
    Par say dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/06/2005, 15h34
  5. INNER JOIN ou WHERE ...
    Par maitrebn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/10/2004, 13h14

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