2011-10-19 6 views
1

Maintenant, j'ai la requête suivante, ce qui me donne le COUNT() de lignes qui ont le même nom. Cependant, disons que je voulais juste que toutes les lignes soient imprimées.imprimer toutes les lignes en double

SELECT l.id, c.first_name, c.last_name, 
    l.source AS 'affiliateId', COUNT(*), 
    c.email, ls.create_date, ls.buyer 
    FROM lead_status AS ls 
    INNER JOIN leads AS l ON l.id = ls.lead_id 
    INNER JOIN contacts AS c ON c.lead_id = l.id 
    WHERE ls.discriminator = 'AUTO_POST' AND l.affiliate_id=1003 
    AND ls.winner =1 AND l.test =0 
    AND l.create_date BETWEEN '2011-10-03' AND '2011-10-19' 
    GROUP BY c.first_name, c.last_name HAVING COUNT(*)>1; 

Je suis en train de passer de:

joe smith 3 
lisa martin 2 

aux personnes suivantes:

joe smith 
joe smith 
joe smith 
lisa martin 
lisa martin 

Aide!

+0

Quel est le schéma de la table (instructions 'CREATE')? Quelle (s) table (s) possède/a les doublons? Par exemple, un contact peut-il apparaître plusieurs fois dans la table des contacts ou plusieurs contacts peuvent-ils faire référence au même contact? – outis

Répondre

3

Vous pouvez joindre à un nombre tableau:

SELECT T1.col1, T2.col2 
FROM 
(
    -- your long query goes here 
) T1 
JOIN numbers 
ON numbers.x <= T1.cnt 

Une table de nombres est juste une table qui contient les numéros:

+---+ 
| x | 
+---+ 
| 1 | 
| 2 | 
| 3 | 
etc... as many numbers as you will ever need 
2

u peut utiliser l'expression COUNT(DISTINCT first_name) puis se débarrasser de GROUP BY

alors la requête sera

SELECT l.id, c.first_name, c.last_name, l.source AS 'affiliateId', COUNT(DISTINCT c.first_name, c.last_name) as CountRows, 
c.email, ls.create_date, ls.buyer FROM lead_status AS ls 
INNER JOIN leads AS l ON l.id = ls.lead_id 
INNER JOIN contacts AS c ON c.lead_id = l.id 
WHERE ls.discriminator = 'AUTO_POST' AND l.affiliate_id=1003 
AND ls.winner =1 AND l.test =0 AND l.create_date BETWEEN '2011-10-03' AND '2011-10-19' 
HAVING CountRows>1 
+0

Et accomplir quoi? (question sérieuse) –

+0

Il veut aussi toutes les lignes imprimées avec COUNT (prénom, nom de famille)? Donc c'est ma solution – Peter

+0

Vous avez raison - l'OP spécifie "même nom". Mais l'exemple fourni les groupes par prénom et nom, donc je pense que "même nom" signifie "même prénom et nom", ce qui signifie essentiellement "lignes dupliquées". –

0

rejoindre le jeu de résultats avec l'histoire des contacts sur le premier prénom et champs de nom (en supposant que le prénom + nom constitue une clé unique)

1

Je ne me souviens pas si MySQL prend en charge les sous-requêtes, mais je faire quelque chose comme

select 
    first, last 
from 
    table where id in (select id from table group by first, last having count(*) > 1) 
order by 
    first, last 
1

Ajouter une autre jointure sur la (les) table (s) où la duplication apparaît. Pour la condition de jointure, les informations d'identification doivent être les mêmes (par exemple, c.first_name = c2.first_name AND c.last_name = c2.last_name ou l.id = c2.id) et tout ce qui distingue les enregistrements doit être différent (par exemple l.create_date < l2.create_date). Enfin, regroupez par l'ID de l'enregistrement qui contient les doublons ou sélectionnez des lignes distinctes pour éviter les répétitions. Sans connaître le schéma de la table ou l'emplacement des doublons, je ne peux pas être plus précis.

Questions connexes