2009-11-16 8 views
2

est-il possible d'utiliser GROUP BY avec une préférence pour les enregistrements?MySQL GROUP BY avec préférence

Par exemple, j'ai tas de données de contact qui peuvent ou peuvent ne pas contenir toutes les informations - dans un sens au format CSV pourrait ressembler à ceci:

Test User, Address1, Address2, [email protected] 
, , , [email protected] 

Si je devais GROUP BY e-mail, j'aimerais pour extraire l'enregistrement le plus pertinent.

Espérons que cela a du sens?

vôtre, Chris

+0

Qu'entendez-vous par "plus d'enregistrement pertinent"? Une autre ligne avec un email identique? Ou une autre colonne? Ou? – Andomar

+0

Salut, supposé ces deux lignes ci-dessus où dans la base de données - je voudrais sortir celui avec les informations de contact plutôt que la rangée avec des champs vides. – ChrisS

Répondre

1

Vous pouvez utiliser une fonction d'agrégation pour obtenir l'enregistrement le plus «pertinent» pour chaque e-mail.
Je pense que cette requête vous obtenir le meilleur résultat:

SELECT emailAddress, max(concat(fullName,',',address1,',',address2)) 
FROM table 
GROUP BY emailAddress 

Il retournera la plus riche ligne pour chaque adresse e-mail, mais toutes les données seront retournés dans une chaîne (séparées par des virgules) de sorte que vous aurez à analyser en quelque sorte.
Si la performance est pas question et que vous souhaitez obtenir un résultat normal fixé dans des champs séparés, vous pouvez alors aller avec un:

SELECT table.emailAddress, fullName, address1, address2 
FROM 
table JOIN 
    (SELECT emailAddress, 
     max(concat(fullName,address1,address2)) as bestRowInOneString 
    FROM table 
    GROUP BY emailAddress 
    ) bestRowsSubQuery 
ON 
    concat(table.fullname,table.address1,table.address2) = bestRowsSubQuery.bestRowInOneString 
    AND table.emailAddress = bestRowsSubQuery.emailAddress 
0

GROUP BY SUBSTRING (champ, N);

0

Je ne sais pas ce que vous voulez dire, mais dans certains (? La plupart) les dialectes SQL que vous pouvez combiner GROUP BY avec CASE logique:

GROUP BY case when col1 = 'x' then col1 else col2 end 

(comme je l'ai dit, je ne sais pas si cela est valable pour MySql).

EDIT: si ce n'est pas valable pour MySql, vous pouvez toujours extraire ce bit de la logique

GROUP BY case when col1 = 'x' then col1 else col2 end 

en vue et SELECT de ce point de vue, GROUP sur la colonne ing contenant la logique par exemple

select * from 
(
    select .... 
    , (case ....) as logic_col 
    from ... 
) x 
group by logic_col 
1

Pour chaque email, cette requête sélectionner l'enregistrement avec les champs définis plus :

SELECT * 
FROM (
     SELECT DISTINCT email 
     FROM mytable 
     ) mi 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mf 
     WHERE mf.email = mi.email 
     ORDER BY 
       username IS NULL + address1 IS NULL + address2 IS NULL DESC 
     LIMIT 1 
     )