Aller au contenu

[RESOLU] [SQL] GROUP BY sur un champ email


djems54

Messages recommandés

Moi je dis que c'est impossible à faire avec une requête SQL (même une énorme).

Pourquoi? Tu as la recherche avec LIKE, mais tu dois connaître à l'avance "orange", "free" etc..

Ensuite dans ta recherche tu dois ignorer les caractères jusqu'à l'arobase (@): impossible avec la recherche SQL. (ou alors faire un truc '%@free')

Enfin, SQL te retounera toujours ton champs en entier: donc pour les count c'est mort.

Je vois 2 moyens:

1) Faire le traitement à côté en C/ PHP/ Autre de toutes tes lignes "SELECT * FROM XXX"

2) Peut-être passer par une extension ou un trigger voire une procédure embarquée. Si tu arrives avec cette solution, tu pourras essayer de faire cela avec 1 seule requête ensuite.

Lien vers le commentaire
Partager sur d’autres sites

et un truc du genre (pas sur à 100% de la syntaxe) ?

select substr(champ_mail,instr(champ_mail,'@')),count(*)

from ta_table

group by substr(champ_mail,instr(champ_mail,'@'))

(sql plutot orienté Oracle mais devrait marcher aussi pour mysql, je crois)

Lien vers le commentaire
Partager sur d’autres sites

Même réponse que sur ton précédent sujet...

C'est peut être possible, flemme de réfléchir, mais ce n'est pas un souhait de requête logique...

Une requête = un ensemble, si tu dois faire des where contradictoires posent toi sérieusement des questions....

Tu veux savoir combien de mails orange : select count(*) from table where mail like '%@orange.fr'.

Combien de mails orange et free ? Fais 2 requêtes.

En plus dans les libs il y a des fonctions spécialement prévues pour accélérer les requêtes avec une valeur de param variant (avec des préparation de groupe de requêtes).

Au final, même si c'est peut être faisable en une seule requête :

_Tu vas perdre infiniment plus de temps à créer tes requêtes avec des sous, sous, sous ensemble que de faire 3 ou 4 requêtes

_Le temps d'exécution sera nettement plus rapide avec plusieurs petites requêtes qu'avec une grosse bourrine nécessitant implicitement la création de temporary table

_La personne qui passera derrière toi ne s'arrachera pas les cheveux à essayer de comprendre ce que tu as fait

Les requêtes SQL c'est comme la littérature. Il y a Proust et ses phrases de 20 lignes, ceux qui écrivent normalement et ceux qui tentent d'imiter Proust :fumer:

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Voilà ce que pourrait donner la version de mempoh pour MySQL, en simplifiée :

SELECT SUBSTRING(`champ_courriel`, INSTR(`champ_courriel`, '@')) AS `courriel`, COUNT(*) FROM `table` GROUP BY `courriel`;

Ou encore un poil plus simple, via une variante de SUBSTRING :

SELECT SUBSTRING_INDEX(`champ_courriel`, '@', -1) AS `courriel`, COUNT(*) FROM `table` GROUP BY `courriel`;

La seule différence au niveau du résultat résidera dans la présence – dans le premier cas – ou non – dans le second cas – de l'arobase, en admettant que les adresses ne contiennent bien sûr qu'une seule arobase, sinon il en sera tout autre. :rtfm:

Voilà, même si a priori, tu as résolu ton problème, ça pourra toujours servir si quelqu'un passe par là et veux la version MySQL. :yes:

Bonne fin de journée, début de soirée. :byebye:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...