Bonjour à toutes et tous,
Je suis amené à retravailler une requête sql d'un site que j'essaie de faire évoluer et je rencontre un souci dans la modification de cette requète.
Je m'explique le site répertoriait ses clients par leur seuls nom et prénom. Il a été décidé d'attribuer aux nouveaux clients un identifiant propre.
Nous avions une requête qui permettait de calculer un classement des meilleurs clients de l'année, classement foireux quand il y avait des homonymes (d'où l'idée de créer un identifiant)
Le souci a donc été d'intégrer dans la requête, cet identifiant.
En effet, (évoluant dans le milieu du droit) cette requête dont l'auteur (un génie selon moi) n'est pas connu est pour moi infiniment complexe puisque effectuant un inner join entre deux tables dont l'une est un alias de l'autre (désolé si les termes sont inadaptés).
Je vous soumets la requête pdo (simplifiée pour la question) et modifiée pour tenir compte de la nouvelle colonne "membre"
Le classement s'effectue hélas sur les clients qui ont un identifiant "membre". Il semble que les clients qui n'ont pas d'identifiant (valeur de membre = null) ne soit pas pris en compte mais je ne sais à quel niveau ces entrées sont ignorées, je suppose que ce n'est pas au niveau du select car un ifnull sur membre ne solutionne pas le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $reqI = $bdd->prepare("INSERT INTO test (nom, prenom, membre, total) (SELECT a.nom, a.prenom, a.membre, round( avg(a.Indice), 2 ) AS total, nb_achat FROM rtable a inner join (select count(achat) as nb_achat,prenom, nom, membre from rtable where date_achat > DATE_ADD(NOW(), INTERVAL -365 DAY) group by nom, prenom, membre) as b on (b.nom=a.nom and b.prenom=a.prenom and b.membre=a.membre) where date_achat > DATE_ADD(NOW(), INTERVAL -365 DAY) and nb_achat >10 and find_in_set( a.Indice, ( SELECT substring_index( group_concat( b.Indice ORDER BY Indice ASC ) , ',', 11) FROM rtable b where date_achat > DATE_ADD(NOW(), INTERVAL -365 DAY) and a.nom = b.nom and a.prenom=b.prenom and a.membre=b.membre GROUP BY b.nom, b.prenom, b.membre ) ) >0 GROUP BY a.nom, a.prenom, a.membre ORDER BY `total` ASC, nb_achat desc)");
Je suppose que le group by ignore les null mais le fait de faire ifnull(membre,0) dans les select aurait du y remédier non ?
Merci par avance à celles et à ceux qui voudront bien se pencher sur mon problème pour m'apporter une piste, parce que ça fait plusieurs jours que j'écume le net sans trouver de solution alors je me décide d'exposer mon problème.
Précision, j'ai songé attribueer à tous les clients sans identifiant le même identifiant bidon via une requête mais la table obèse présentant plus d'1 .500.000 entrées, j'aimerai éviter.
n.
Partager