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 :

[MySQL] count sur une table avec condition entre celle-ci et une autre


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut [MySQL] count sur une table avec condition entre celle-ci et une autre
    Bonjour,

    Voilà j'ai une belle erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
    Ma requête est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $totalRep="SELECT 
    count(distinct sousCommentaire.idCom) 
    FROM sousCommentaire 
    WHERE sousCommentaire.idMembre='".$numeroConnexion."' 
    AND commentaire.idMembre!=sousCommentaire.idMembre ";
    Le but est le suivant :
    j'ai des réponses (sousCommentaire) qui sont reliées à des sujets (commentaire).
    Le sujet peut être laissé par un membre (idMembre).
    Idem pour les réponses.
    Le but est de compter tous les sujets auxquels au moins une réponse a été apportée par le membre a condition que le dit membre ne soit pas l'auteur de ce sujet.

    Exemple :
    On compte les sujets auxquels A a participé, mais qu'il n'a pas initié lui même.
    1) commentaire 1:
    idMembre= A
    => il y a une réponse de A dans ce sujet.
    ==> on ne compte pas ce commentaire car A en est l'auteur
    2) commentaire 2:
    idMembre= B
    => il y a une réponse de A dans ce sujet.
    ==> on compte commentaire 2 car A n'en est pas l'auteur.

    les champs communs entre les tables commentaire et sousCommentaire:
    - commentaire.id=sousCommentaire.idCom
    - les deux tables ont un champ idMembre qui correspond soit à l'id du membre qui a initié le sujet soit, pour la table sousCommentaire à l'id du membre qui a apporté une réponse

    Voilà j'espère m'être bien expliqué et je vous remercie d'avance pour vos réponses.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    J'ai commis ça, vous en pensez quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DISTINCT 
    sousCommentaire.idCom, commentaire.id
    FROM sousCommentaire,commentaire
    WHERE sousCommentaire.idMembre='".$numeroConnexion."' 
    AND commentaire.idMembre !='".$numeroConnexion."'
    Cela ne déclenche point d'erreur mais cela ne signifie pas pour autant que c'est bon. Surtout que là je vais chercher les commentaire.id dont je n'ai aucun besoin, mais est-ce possible de faire autrement ?
    Je doute que ma requête fasse vraiment ce que je lui demande...

    **edit**
    je viens de récidiver avec ça, ça vous parait plus judicieux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT 
    sousCommentaire.idCom,commentaire.id
    FROM sousCommentaire,commentaire
    WHERE sousCommentaire.idMembre='".$numeroConnexion."' 
    AND sousCommentaire.idCom=commentaire.id 
    AND commentaire.idMembre !='".$numeroConnexion."'
    **edit**
    ça va pas là, je ramasse aussi les commentaire.id je crois bien
    Faudrait faire un select dans le where non ?

  3. #3
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT 
    commentaire.id
    FROM sousCommentaire,commentaire
    WHERE sousCommentaire.idMembre='".$numeroConnexion."' 
    AND sousCommentaire.idCom=commentaire.id 
    AND commentaire.idMembre !='".$numeroConnexion."'

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Tiens ça me déclenche pas d'erreur

    Pourtant tu fais FROM sousCommentaire,commentaire alors que tu vas rien chercher dans la table sousCommentaire ???

    Remarque j'ai pas dit que ça fonctionne, je dois effectuer quelques tests, mais en tout cas ça ne déclenche pas d'erreur.

    C'est abuser que de te demander de traduire en français ta requête, pour voir si tu as bien compris ce que je cherche à faire ?

    **edit**
    Raté,
    ça ne fonctionne pas,
    ça ne devrait me sortir qu'un résultat et manifestement ça me compte tous les tuples auxquels le membre à participé, qu'il en soit l'auteur ou non.

  5. #5
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par psychoBob
    Pourtant tu fais FROM sousCommentaire,commentaire alors que tu vas rien chercher dans la table sousCommentaire ???
    Attention on va pas chercher dans la table sousCommentaire, on va chercher dans la table résultante d'une jointure entre la table sousCommentaire et la table commentaire ... c'est pas pareil ...
    Le DISTINCT permet d'éliminer les doubles sur l'id commentaire puisqu'on a tous les couples commentaire / sousCommentaire dans la jointure ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Oui mais ça fonctionne pas quand même

    (je reprécise parce que peut être tu écrivais cela pendant que j'éditais).

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je le ferais bien avec une double requête, via php, mais il doit justement y avoir moyen de faire ces deux requêtes en une seule.

    Avec php ça donnerait un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT 
    sousCommentaire.idCom AS clef
    FROM sousCommentaire
    WHERE sousCommentaire.idMembre='".$numeroConnexion."' 
    WHILE (blablabla_scriptPHP_blablabla)
    {
    SELECT DISTINCT 
    commentaire.id
    FROM commentaire
    WHERE commentaire.idMembre!='"$numeroConnexion"' AND commentaire.idCom='"$R[clef]"'
    ==>mysql_num_rows sur cette deuxième requête select
    }
    Je sais c'est abominable comme exemple de script, mais c'est pour dire qu'avec deux requête sql ça parait plus simple mais on doit pouvoir faire un select dans la première requête.

  8. #8
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Peut être un problème de corrélation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT 
    commentaire.id
    FROM sousCommentaire,commentaire
    WHERE sousCommentaire.idMembre='".$numeroConnexion."' 
    AND sousCommentaire.idCom=commentaire.id 
    AND commentaire.idMembre != sousCcommentaire.idMenbre'
    C'est quand même curieux, car on avait bien un prédicat d'inégalité sur l'auteur du sujet ...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Fonctionne pas non plus.
    A mon avis faut un select dans la requete, comme j'ai écrit deux posts au dessus, pendant que tu faisais de même

  10. #10
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Bon je dois être fatigué alors ...
    D'ailleurs je vais me coucher ...
    Tu risque d'avoir une bonne réponse ce jour car il y a des "pointures" en SQL sur le forum ...
    Bonne nuit ...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon voilà, j'ai fait ça, à priori la requête est bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $totalRep="SELECT 
    sousCommentaire.idCom AS clef
    FROM sousCommentaire
    WHERE sousCommentaire.idMembre='".$numeroConnexion."'";
    $resultat=mysql_query("$affiche");
    while($R = mysql_fetch_array($resultat))
    {
    $tri="SELECT DISTINCT 
    commentaire.id
    FROM commentaire
    WHERE commentaire.idMembre!='".$numeroConnexion."' AND commentaire.id='".$R[clef]."'"
    $result = mysql_query("$tri") ;
    $row = mysql_fetch_row($result);
    Le problème c'est que maintenant le script php qui suit ne fonctionne plus.
    L'idéal serait de faire en sorte que le deuxième SELECT soit imbriqué dans le premier, ce qui ne ferait plus qu'une seule requête sans la boucle WHILE et me permettrait d'éviter d'aller squatter le forum PHP.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    sinon on peut le faire autrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(distinct idCom) 
    FROM sousCommentaire 
    WHERE idMembre='".$numeroConnexion."
    Mais là, pareil, il ne faut pas aller chercher les sousCommentaire là où commentaire.idMembre = "numeroConnexion" et commentaire.id=sousCommentaire.idCom.

    Peut être qu'à la place de commentaire.idMembre="numeroConnexion", nous pourrions utiliser commentaire.idMembre=sousCommentaire.idMembre

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je viens de faire un test pour afficher le $row (soit le nombre de ligne) ça m'affiche 1 avec le script deux posts plus haut.

    Oui je sais ça vous fait une belle jambe, mais bon je désespère pas.

Discussions similaires

  1. Update sur une table avec conditions
    Par tibss dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/07/2011, 17h13
  2. Export d'une table avec condition sur une autre
    Par Hobbi1 dans le forum Import/Export
    Réponses: 2
    Dernier message: 25/03/2010, 14h35
  3. Requête sur 3 tables avec conditions
    Par graphiks dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2009, 10h00
  4. Création d'une table avec condition
    Par sofiane_bfm007 dans le forum SQL
    Réponses: 4
    Dernier message: 20/10/2008, 16h17
  5. MAJ d'un champ d'une table avec condition sur clef primaire commune
    Par ar|equin dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/05/2007, 13h57

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