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 :

calculer le nombre d'éléments communs entre 2 champs ds mm table ?


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut calculer le nombre d'éléments communs entre 2 champs ds mm table ?
    Bonjour,

    voila, j'ai une table user_group avec 2 champs group_id et user_id pour contenir l'id de plusieurs groupes et les id des utilisateurs qui appartiennent à ces différents groupes.
    Et je voudrais calculer le nombre d'utilisateur communs entre 2 groupes.
    Comment faire ?

    Edit :
    ça se présente comme ça par exemple :
    group_id | user_id
    1 | 2
    1 | 3
    2 | 2
    1 | 4
    3 | 3
    2 | 4

    donc quand on fait le test pour les groupes 1 et 2, on a 2 utilisateurs communs (2 et 4).

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    pourquoi pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT COUNT(T1.user_id)
    FROM group T1
       INNER JOIN group T2
          ON T1.user_id = T2.user_id
             AND T1.group_id < T2.group_id
    WHERE T1.group_id = @id_group1
       AND T2.group_id = @id_group2
    bien sûr il faut que @id_group1 < @id_group2

    si tu veux t'affranchir de ça, c'est un peu plus complexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT COUNT(T1.user_id)
    FROM group T1
       INNER JOIN group T2
          ON T1.user_id = T2.user_id
             AND T1.group_id < T2.group_id
    WHERE (
       T1.group_id = @id_group1
       AND T2.group_id = @id_group2
    ) OR (
       T1.group_id = @id_group2
       AND T2.group_id = @id_group1
    )
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Variante (à essayer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT 
    	gl.group_id,
    	gr.group_id,
    	COUNT (gl.user_id)
    FROM	user_group gl
    INNER JOIN user_group gr
    ON	gl.user_id = gr.user_id
    WHERE	gl.group_id <> gr.group_id
    GROUP BY 
    	gl.group_id,
    	gr.group_id

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Swoög
    ...
    Non, ca n'a pas l'air d'être ça. Il s'agit de la même table.

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par RedShift2
    Non, ca n'a pas l'air d'être ça. Il s'agit de la même table.
    et alors ? ça s'appelle une auto jointure (jointure d'une table à elle-même)

    test la requête avant de critiquer s'il te plaît
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Swoög
    et alors ? ça s'appelle une auto jointure (jointure d'une table à elle-même)

    test la requête avant de critiquer s'il te plaît
    Désolé si je t'ai choqué, je suis assez nul en SQL et je ne me permettrais pas de critiquer mais je considère pas ça comme une critique. C'est juste que j'ai l'impression que ça ne correspond pas à ce que je veux.
    Et quand je teste la requête telle quelle, j'ai droit à une erreur.

    PS : J'ai édité mon premier message pour être plus clair.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par TheLeadingEdge
    Variante (à essayer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT 
    	gl.group_id,
    	gr.group_id,
    	COUNT (gl.user_id)
    FROM	user_group gl
    INNER JOIN user_group gr
    ON	gl.user_id = gr.user_id
    WHERE	gl.group_id <> gr.group_id
    GROUP BY 
    	gl.group_id,
    	gr.group_id
    Ca n'a pas l'air d'être ça non plus.
    J'ai pas d'erreur SQL mais ça ne fait pas ce que je veux.

  8. #8
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Swoog à raison, avec 1 '<' c'est mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT 
    	gl.group_id,
    	gr.group_id,
    	COUNT (gl.user_id)
    FROM	user_group gl
    INNER JOIN user_group gr
    ON	gl.user_id = gr.user_id
    AND	gl.group_id < gr.group_id
    GROUP BY 
    	gl.group_id,
    	gr.group_id
    ;
    Si tu veux aussi les user, c'est plus lourd
    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
    SELECT 	g.gl,
    	g.gr,
    	g1.user_id,
    	g.s
    FROM
    user_group g1
    INNER JOIN user_group g2
    ON 	g1.user_id = g2.user_id
    INNER JOIN
    (
    SELECT DISTINCT 
    	gl.group_id as gl,
    	gr.group_id as gr,
    	COUNT (gl.user_id) as s
    FROM	user_group gl
    INNER JOIN user_group gr
    ON	gl.user_id = gr.user_id
    AND	gl.group_id < gr.group_id
    GROUP BY 
    	gl.group_id,
    	gr.group_id
    ) g
    ON	g1.group_id = g.gr
    AND	g2.group_id = g.gl
    ;
    [edit] j'avais pas vu ta réponse. Donne 1 exemple du résultat que tu veux alors. (sauf si c'est 1 matrice!)[/edit]

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    quelle erreur as-tu alors ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par TheLeadingEdge

    Si tu veux aussi les user, c'est plus lourd

    non non pas besoin pour l'instant j'aimerai déjà que ça marche comme ça

    [edit] j'avais pas vu ta réponse. Donne 1 exemple du résultat que tu veux alors. (sauf si c'est 1 matrice!)[/edit]

    J'ai modifié le 1er post, ça ne t'aide pas plus ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Swoög
    quelle erreur as-tu alors ?
    #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP T1
    INNER JOIN GROUP T2 ON T1.user_id = T2.user_id AND T
    Question de noob, mais d'où vous les sortez vos T1, T2 et gl, gr ?

  12. #12
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Group_id   Group_id Count(gl.user_id)
    ---------- ---------- -----------------
             1          2                 2
             1          3                 1
    Voila ce que j'obtient avec ton ''jeu d'essai''

    Si ce n'est pas ce que te tu veux,
    donne 1 exemple sous la meme forme de ce que tu veux obtenir à partir de tes données

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par TheLeadingEdge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Group_id   Group_id Count(gl.user_id)
    ---------- ---------- -----------------
             1          2                 2
             1          3                 1
    Voila ce que j'obtient avec ton ''jeu d'essai''

    Si ce n'est pas ce que te tu veux,
    donne 1 exemple sous la meme forme de ce que tu veux obtenir à partir de tes données
    Ok donc apparemment toi tu testes tous les groupes qui ont des éléments communs et tu donnes le nombre d'éléments communs.
    Ce que je veux est bien plus simple (enfin je suppose lol).
    Moi dans me requête, je veux juste savoir le nombre d'éléménts communs entre 2 groupes :
    exemples :
    combien y a-t-il d'éléments communs dans le group_id 1 et le group_id 2, réponse 2
    combien y a-t-il d'éléments communs dans le group_id 1 et le group_id 3, réponse 1
    combien y a-t-il d'éléments communs dans le group_id 2 et le group_id 3, réponse 0

    Pas besoin de faire le test pour chaque groupe. Juste un test par requête.

    J'espère être clair, je suis vraiment nul en SQL

  14. #14
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Si tu veux tester le nbre de users communs entre ton groupe 1 et ton groupe 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT 
    	gl.group_id,
    	gr.group_id,
    	COUNT (gl.user_id)
    FROM	user_group gl
    INNER JOIN user_group gr
    ON	gl.user_id = gr.user_id
    AND	gl.group_id = 1
    AND 	gr.group_id = 2
    GROUP BY 
    	gl.group_id,
    	gr.group_id
    ;

    Si tu veux paramétrer les groupes que tu testes il va falloir demander (gentillement ) à swoog, moi je sais pas faire avec mysql.

    A propos les rq de swoog marchent bien aussi. Il faut simplement que tu remplace tes noms de tables GROUP par user_group

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bon, je vais devoir repasser plus tard, ya de l'orage chez moi. a+

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par TheLeadingEdge
    Si tu veux tester le nbre de users communs entre ton groupe 1 et ton groupe 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT 
    	gl.group_id,
    	gr.group_id,
    	COUNT (gl.user_id)
    FROM	user_group gl
    INNER JOIN user_group gr
    ON	gl.user_id = gr.user_id
    AND	gl.group_id = 1
    AND 	gr.group_id = 2
    GROUP BY 
    	gl.group_id,
    	gr.group_id
    ;

    Si tu veux paramétrer les groupes que tu testes il va falloir demander (gentillement ) à swoog, moi je sais pas faire avec mysql.

    A propos les rq de swoog marchent bien aussi. Il faut simplement que tu remplace tes noms de tables GROUP par user_group
    Ca marche !!!
    Merci à vous deux.
    Les requêtes de swoög marchent aussi (sorry ). J'avais pas remplacé les @id_group par l'id de mes groupes. (je vous ai déjà dit que j'étais nul en sql ? )

    Edit : par contre, je vois pas trop en quoi le DISTINCT est important ?

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

Discussions similaires

  1. Nombre d'éléments communs entre deux tableaux
    Par momo-mtl dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 19/02/2015, 10h08
  2. Réponses: 49
    Dernier message: 26/05/2010, 21h58
  3. Réponses: 1
    Dernier message: 10/08/2006, 14h43
  4. Comparaison de base et calculs du nombre d'éléments dans Bas
    Par BXDSPORT dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/07/2004, 08h00

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