[sql]Requête qui affiche les doublons à partir d'un critère

Requête qui affiche les doublons à partir d'un critère [sql] - SQL/NoSQL - Programmation

Marsh Posté le 22-01-2009 à 12:16:58    

Bonjour à tous,
 
Je galère un peu pour une requête et j'arrive pas à trouver de réponse. Je vous explique:
 
J'ai 3 tables:
 
corresptache: id, idcatache, idtache, idclient
tache: idtache, iduser, etc...
user: iduser, civ, nom, prenom ...
 
Voici un exemple de ca qu'il y a dans la table corresptache:
 
                    coresptache
  id         idcatache       idtache      idclient
     1             56                 23             5
     2             45                 24             5
     3             56                 25             5
 
 
J'ai besoin de savoir le idtache des occurences de corresptache qui ont le meme idcatache ET le meme idclient (en rouge ci dessus).
 
Le but était d'avertir le user des doublons dans corresptache et de regarder quel autre user a cette tache.
 
J'espère être clair et surtout que vous allez pouvoir m'aider.
 
Merci
 
EDIT: J'ai déjà essayé  
 
SELECT * , count( * ) FROM corresptache GROUP BY idcatache, id_client HAVING count( * ) >1  
 
Mais ca ne m'affiche qu'un des 2 idtache


Message édité par aspirateur le 22-01-2009 à 12:24:09
Reply

Marsh Posté le 22-01-2009 à 12:16:58   

Reply

Marsh Posté le 22-01-2009 à 13:45:12    

Citation :

J'espère être clair

Pas tout à fait. Par exemple, je ne vois pas bien pourquoi il est parlé des tables tache et user alors qu'il semble que seul la table corresptache soit vraiment concernée.
 
Voici une requête (en Oracle) qui répond au problème posé :  

Select c1.idtache
  from coresptache c1
 where c1.idcatache || '-' || c1.idclient  
   in (select c2.idcatache || '-' || c2.idclient  
         from coresptache c2
        where c2.idcatache = c1.idcatache
          and c2.idclient = c1.idclient
          and c2.idtache <> c1.idtache)

Reply

Marsh Posté le 22-01-2009 à 15:30:01    

Merci de ton aide, finallement j'ai fais en deux étapes:
 

Code :
  1. "SELECT * , count( * ) FROM user INNER JOIN ( corresptache INNER JOIN tache ON corresptache.idtache = tache.idtache ) ON user.id_user = tache.iduser GROUP BY idcatache, id_client HAVING count( * ) >1"


 
pour avoir la liste des doublons
 
puis dans un deuxième temps:
 

Code :
  1. SELECT user. * , tache. * , corresptache. * FROM user INNER JOIN ( corresptache INNER JOIN tache ON corresptache.idtache = tache.idtache ) ON user.id_user = tache.iduser WHERE ( ( ( corresptache.id_client ) = '$idclientdoublon' ) AND ( ( corresptache.idcatache ) = '$idcatachedoublon' ) AND ( ( tache.iduser ) = '$iduser' ) )


 
pour trier pour un utilisateur.
 
ainsi j'ai la liste des doublon pour mon utilisateur.
 

Reply

Marsh Posté le 22-01-2009 à 15:37:06    

euh tu peut le faire en une requete facile je pense

Code :
  1. select c1.idcatache from coresptache as c1,coresptache  as c2 where
  2. c1.idcatache=c2.idcatache and c1.idclient=c2.idclient


je pense que ca doit marcher

Reply

Marsh Posté le 23-01-2009 à 08:20:16    

si c'est de l'oracle:
 

Code :
  1. select *
  2. from
  3. (select c.*,
  4.          count(*)over(partition by idtache,idclient) as nbr
  5. from coresptache c)
  6. where nbr > 1


Reply

Marsh Posté le 23-01-2009 à 13:26:06    

:jap:  Merci pour vos réponses.
 
J'ai pas tenté de simplifier la requête mais je garde ca sous le coude

Reply

Marsh Posté le 30-01-2009 à 16:52:13    

Code :
  1. SELECT idtache
  2. FROM corresptache c2
  3. INNER JOIN (
  4. SELECT c1.idcatache, c1.idclient
  5. FROM corresptache c1
  6. GROUP BY c1.idcatache, c1.idclient
  7. HAVING COUNT(c1.idtache) > 1
  8. ) tmp ON c2.idcatache = tmp.idcatache AND c2.idclient = tmp.idclient


 


idtache
-------
25
23
 
(2 row(s) affected)
 

Reply

Marsh Posté le 30-01-2009 à 18:44:23    

Si c'est uniquement à but d'affichage, en une seule requête, t'as "group_concat" (a mettre dans le select) avec mysql qui permet d'avoir une réponse du genre "23, 25".


Message édité par omega2 le 30-01-2009 à 18:45:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed